有没有办法在 JavaScript 中返回两个数组之间的差异?
例如:
var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];
// need ["c", "d"]
有没有办法在 JavaScript 中返回两个数组之间的差异?
例如:
var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];
// need ["c", "d"]
使用 ES7 有更好的方法:
路口
let intersection = arr1.filter(x => arr2.includes(x));
因为[1,2,3] [2,3]
它会屈服[2,3]
。另一方面, for[1,2,3] [2,3,5]
将返回相同的东西。
区别
let difference = arr1.filter(x => !arr2.includes(x));
因为[1,2,3] [2,3]
它会屈服[1]
。另一方面, for[1,2,3] [2,3,5]
将返回相同的东西。
对于对称差异,您可以执行以下操作:
let difference = arr1
.filter(x => !arr2.includes(x))
.concat(arr2.filter(x => !arr1.includes(x)));
这样,您将获得一个包含 arr1 中所有不在 arr2 中的元素的数组,反之亦然
正如@Joshaven Potter 在他的回答中指出的那样,您可以将其添加到 Array.prototype 中,这样它就可以像这样使用:
Array.prototype.diff = function(arr2) { return this.filter(x => !arr2.includes(x)); }
[1, 2, 3].diff([2, 3])
Array.prototype.diff = function(a) {
return this.filter(function(i) {return a.indexOf(i) < 0;});
};
//////////////
// Examples //
//////////////
const dif1 = [1,2,3,4,5,6].diff( [3,4,5] );
console.log(dif1); // => [1, 2, 6]
const dif2 = ["test1", "test2","test3","test4","test5","test6"].diff(["test1","test2","test3","test4"]);
console.log(dif2); // => ["test5", "test6"]
注意 .indexOf()
和.filter()
在 IE9 之前不可用。
这是迄今为止使用 jQuery 准确获得您正在寻找的结果的最简单方法:
var diff = $(old_array).not(new_array).get();
diff
现在包含old_array
不在的内容new_array
这个答案是在 2009 年写的,所以有点过时了,而且对于理解这个问题也很有教育意义。我今天使用的最佳解决方案是
let difference = arr1.filter(x => !arr2.includes(x));
(此处感谢其他作者)
我假设您正在比较普通数组。如果不是,则需要将for循环更改为for .. in循环。
function arr_diff (a1, a2) {
var a = [], diff = [];
for (var i = 0; i < a1.length; i++) {
a[a1[i]] = true;
}
for (var i = 0; i < a2.length; i++) {
if (a[a2[i]]) {
delete a[a2[i]];
} else {
a[a2[i]] = true;
}
}
for (var k in a) {
diff.push(k);
}
return diff;
}
console.log(arr_diff(['a', 'b'], ['a', 'b', 'c', 'd']));
console.log(arr_diff("abcd", "abcde"));
console.log(arr_diff("zxc", "zxc"));
Underscore 中的差异方法(或其直接替代品Lo-Dash)也可以做到这一点:
(R)eturns the values from array that are not present in the other arrays
_.difference([1, 2, 3, 4, 5], [5, 2, 10]);
=> [1, 3, 4]
与任何 Underscore 函数一样,您也可以以更面向对象的风格使用它:
_([1, 2, 3, 4, 5]).difference([5, 2, 10]);