假如 a=[1,2,3,4,5] b=[2,3,4,6,7]
那么b相对于a删去的元素组成的数组 c=[1,5]
b相对于a新增的元素组成的数组 d=[6,7]
c和d怎么求比较优雅?
大家回答都很好,不过我还是决定采纳最早帮助我解决问题的小伙伴,感谢各位亲
假如 a=[1,2,3,4,5] b=[2,3,4,6,7]
那么b相对于a删去的元素组成的数组 c=[1,5]
b相对于a新增的元素组成的数组 d=[6,7]
c和d怎么求比较优雅?
大家回答都很好,不过我还是决定采纳最早帮助我解决问题的小伙伴,感谢各位亲
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;
});
13 回答12.7k 阅读
7 回答1.8k 阅读
3 回答1k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
2 回答1.8k 阅读
2 回答1.1k 阅读✓ 已解决
泻药。
虽然这个includes是ES7的语法,
filter是ES6的语法,filter是ES5语法,感谢 @小明,不过他不兼容IE8。。。其实ES5下的逻辑也是一样的,c就是循环a,然后逐个去b中匹配。