JS中如何比较两个数组,取得数组二相对于数组一新增和去除的元素

假如  a=[1,2,3,4,5]    b=[2,3,4,6,7]

那么b相对于a删去的元素组成的数组  c=[1,5]
    b相对于a新增的元素组成的数组  d=[6,7]
    
    
    c和d怎么求比较优雅?

大家回答都很好,不过我还是决定采纳最早帮助我解决问题的小伙伴,感谢各位亲

阅读 4.6k
6 个回答

泻药。
虽然这个includes是ES7的语法,filter是ES6的语法,filter是ES5语法,感谢 @小明,不过他不兼容IE8。。。

let c = a.filter(i => !b.includes(i))
let d = b.filter(j => !a.includes(j))

其实ES5下的逻辑也是一样的,c就是循环a,然后逐个去b中匹配。

a.filter(i => {return b.indexOf(i) === -1})
b.filter(i => {return a.indexOf(i) === -1})

谢邀。

ES5 的办法参考 @michael_cai 的回答,不过我一般喜欢用 < 0 而不是 === -1

也可以用 ES2016 的 includes,除了 IE,基本上都支持,这个参考 @spencerht 的回答。

用 Set 的办法, @CRIMX 已经回答了。

以上办法都很简洁……不过如果用 Lodash 的话,当然会有理简洁的方法

var c = _.difference(a, b);
var d = _.difference(b, a);

除了 _.difference,还有一个 _.pullAll,不过后者会改变原数组,换句话说,_.pullAll(a, b) 之后 a 已经变了,再 _.pullAll(b, a) 就没意义了。

拿走不谢

var a = [1,2,3,4,5]
var b = [2,3,4,6,7]


function func(arr1,arr2){
    var arr = [];
    var bool = false;
    for(var i=0;i<arr1.length;i++){
        for(var j=0;j<arr2.length;j++){
        //进行优化遇到相同直接跳出循环 同时支持对象比对
            if(JSON.stringify(arr1[i])===JSON.stringify(arr2[j])){
                bool = false;
                break;
            }else{
                bool=i;
            }
        }
        if(bool!==false)arr.push(arr1[bool]);
    }
    return arr;
}
console.log(func(a,b))//[1,5]
console.log(func(b,a))//[6,7]

//还可以对比数组里的对象
var json1 = [{name:1},{name:2},{name:["a","j"]},{name:{id:1}}]
var json2 = [{name:2},{name:3},{name:["a","j"]}]

console.log(func(json1,json2))//{name:1},{name:{id:1}}
console.log(func(json2,json1))//[{name:3}]

数据量小可以用 includes 或者 indexOf,大的话可能会有性能问题哦,可以用 Set 或者 Map。

比如

let setA = new Set(a)
b.forEach(x => setA.delete(x))
let c = Array.from(setA)
        var c = a.filter(function(val){
          return b.indexOf(val)< 0;
        });
        
        var d = b.filter(function(val){
          return a.indexOf(val)< 0;
        });     
推荐问题