JavaScript必知必会(三)

1.数组去重

ES6解法-set

Array.from(new Set(arr))

ES5解法-indexOf

indexOf可以返回该元素第一次出现的位置,根据indexOf()返回的值来判断元素是否重复。

此方法无法去重NaN,因为NaN === NaN的值为false。

将两种方法结合的写法如下:

function unique(array) {
    if(Set) {
        return Array.from(new Set(array));
    } else {
        var newArray = [];
        for(var i=0; i<array.length; i++) {
            if(newArray.indexOf(array[i]) === -1) {  // 无法去重NaN
                newArray.push(array[i]);
            }
        }
        // 对NaN进行一次过滤
        var flag = false, length = newArray.length;
        for(i=0; i<length; i++) {
            if(typeof(newArray[i]) === 'number' && newArray[i].toString() === 'NaN') {
                if(flag) {
                    newArray.splice(i,1);
                    length = newArray.length;
                    i--;
                } else {
                    flag = true;
                }
            }
        }
        return newArray;
    }
}

2.查找字符串中出重复次数前n名的字符并分别统计其次数

实现如下:

function topChar(string, n) {
    var map = {}, arr = [];
    for(var i=0; i<string.length; i++) {
        if(typeof(map[string[i]]) == 'undefined') {
            map[string[i]] = 1;
        } else {
            map[string[i]]++;
        }
    }
    for(i in map) {
        arr.push({
            char: i,
            count: map[i]
        });
    }
    arr.sort(function(a,b) {
        return  b.count - a.count;
    });
    for(i=0; i<n; i++) {
        console.log('top'+(i+1) + ':' + arr[i].char + ',出现次数:' + arr[i].count);
    }
}

测试如下:

topChar('msmsmskskskmeeq', 3);

top1:s,出现次数:5
top2:m,出现次数:4
top3:k,出现次数:3

3.a、b两个字符串,不借助其他变量,实现a与b交换

法一: ES6结构

[a,b] = [b,a];

法二:将a变成对象,存储两个字符串

    a = {
        a: a,
        b: b
    };
    b = a.a;
    a = a.b;
}

法三:利用位运算符优先级

a = [b,b=a][0];

上面的代码会先执行b=a,然后执行b=a。

4.随机生成长度为n的字符串,字符串取值[a-z][A-Z][0-9]

常见字符对应的ASCII码:

  • 0-9 48-57

  • A-Z 65-90

  • a-z 97-122

下面我们实现这个方法:

function getStr(n) {
    function getChar() {
        var n = Math.floor(Math.random()*62); // 向下取整
        if(n < 10) {
            return n; // 0-9       
        } else if (n < 36) {
            return String.fromCharCode(n+55); // A-Z
        } else {
            return String.fromCharCode(n+61); // a-z
        }
    }
    var str = '';
    for(var i=0; i<n; i++) {
        str += getChar();
    }
    return str;
}

5.参考资料

Last updated