var arr1 = [1];
var arr2 = [1,2];
请问请注意 第一个数组 比第二个数组数量少!
Array.prototype.diff = function(a) {
return this.filter(function(i) {return a.indexOf(i) < 0;});
};
[1,2].diff([1]);//[2]
a.filter(ea=>b.every(eb=>eb!==ea));
filter
筛选a集合的元素,如果当前筛选的元素与b集合中的every
每一个元素都不相等vb!==va
,则将此元素加入到返回集合中
Array.prototype.filter
循环数组的每个元素并计算
如果返回true
,则将元素加入到返回的集合中
如果返回false
,则跳过
Array.prototype.every
循环数组的每个元素并计算
如果所有计算结果都为true
,则返回true
否则返回 false
这个或许对你有用:
var isNaN = Number.isNaN;
var difference = function(arr1, arr2) {
return arr1.reduce(function(previous, i) {
var found = arr2.findIndex(function(j) {
return j === i || (isNaN(i) && isNaN(j));
});
return (found < 0 && previous.push(i), previous);
}, []);
};
var arr1 = [1];
var arr2 = [1, 2];
console.log(difference(arr2, arr1)); //[ 2 ]
对于集合A、B,我们把集合{x∣x∈A,且x∉B}叫做A与B的差集
首先考虑到的是 ES6 的 Set 来处理,这是真正按照数学上的集合来进行的,不会有重复元素:
var subSet = function(arr1, arr2) {
var set1 = new Set(arr1);
var set2 = new Set(arr2);
var subset = [];
for (let item of set1) {
if (!set2.has(item)) {
subset.push(item);
}
}
return subset;
};
其次,常规办法,不负责去重:
var subSet = function(arr1, arr2) {
var len = arr1.length;
var arr = [];
while (len--) {
if (arr2.indexOf(arr1[len]) < 0) {
arr.push(arr1[len]);
}
}
return arr;
};
看看这个能不能符合你的需求
// 数组求差值
var arr1 = [1, 2, 4, 9, 0];
var arr2 = [2, 4, 7, 8];
var difference = function(arr1, arr2) {
var diff = [];
var tmp = arr2;
arr1.forEach(function(val1, i){
if (arr2.indexOf(val1) < 0) {
diff.push(val1);
} else {
tmp.splice(tmp.indexOf(val1), 1);
}
});
console.log(diff.concat(tmp));
}
// 输出 [ 1, 9, 0, 7, 8 ]
difference(arr1, arr2);
function diff(arr1, arr2) {
return arr1.concat(arr2).filter(function(arg){
return !(arr1.indexOf(arg) >= 0 && arr2.indexOf(arg) >= 0);
});
}
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决