数组去重

作者: bkbtp 分类: 前端 发布时间: 2018-04-10 11:59

利用Set(ES6)

var arr = [1, '1', 2, 'a', 3, 8, 4, 5, '杨仔', '2', 5, 7, 'a', 'ab', [1, 3], {a: 1}, 1, 3, false, false]

console.log([...new Set(arr)])
// [1, "1", 2, "a", 3, 8, 4, 5, "杨仔", "2", 7, "ab", Array(2), {…}, false]

循环嵌套去重(常用)

var arr = [1, '1', 2, 'a', 3, 8, 4, 5, '杨仔', '2', 5, 7, 'a', 'ab', [1, 3], {a: 1}, 1, 3, false, false]

var len = arr.length
for(var i = 0; i< len; i++){
    for(var j = i +1; j< len; j++) {
        if(arr[i] === arr[j]) {
            arr.splice(j, 1)
        }
    }
}

console.log(arr)
// [1, "1", 2, "a", 3, 8, 4, 5, "杨仔", "2", 7, "ab", Array(2), {…}, false]

对象方法(有缺陷)

var arr = [1, '1', 2, 'a', 3, 8, 4, 5, '杨仔', '2', 5, 7, 'a', 'ab', [1, 3], {a: 1}, 1, 3, false, false]

var obj = {}
var newArr =[]
arr.forEach(e => {
    if(!obj[e]) {
        obj[e] = 1
        newArr.push(e)
    }
})

console.log(newArr)
// [1, 2, "a", 3, 8, 4, 5, "杨仔", 7, "ab", Array(2), {…}, false]

可以发现,这种方法无法辨别包含隐式转换的数据。这是由于JavaScript的对象有个小问题,就是键必须是字符串。下个方法进行改进。
ps. 项目中这样用也问题不大,一般情况下,不会有多种数据类型杂在一起的数组-_-|||

类对象方法(Map)(ES6)

var arr = [1, '1', 2, 'a', 3, 8, 4, 5, '杨仔', '2', 5, 7, 'a', 'ab', [1, 3], {a: 1}, 1, 3, false, false]

var obj = new Map()
var newArr =[]
arr.forEach(e => {
    if(!obj.has(e)) {
        obj.set(e, 1)
        newArr.push(e)
    }
})

console.log(newArr)
// [1, "1", 2, "a", 3, 8, 4, 5, "杨仔", "2", 7, "ab", Array(2), {…}, false]

indexOf方法

var arr = [1, '1', 2, 'a', 3, 8, 4, 5, '杨仔', '2', 5, 7, 'a', 'ab', [1, 3], {a: 1}, 1, 3, false, false]

var newarr = [];
for(var i=0;i<arr.length;i++){
    if(newarr.indexOf(arr[i]) === -1){
        newarr.push(arr[i]);
    }
}

console.log(newarr)
// [1, "1", 2, "a", 3, 8, 4, 5, "杨仔", "2", 7, "ab", Array(2), {…}, false]

附:Map和Set语法篇

发表评论

电子邮件地址不会被公开。 必填项已用*标注

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。