如何在 JavaScript 中获取两个数组之间的差异?

新手上路,请多包涵

有没有办法在 JavaScript 中返回两个数组之间的差异?

例如:

var a1 = ['a', 'b'];
var a2 = ['a', 'b', 'c', 'd'];

// need ["c", "d"]

原文由 John Adawan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 753
2 个回答

这个答案是在 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"));

原文由 Thinker 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 ES7 有更好的方法:


路口

 let intersection = arr1.filter(x => arr2.includes(x));

交差维恩图

对于 [1,2,3] [2,3] 它将产生 [2,3] 。另一方面,对于 [1,2,3] [2,3,5] 将返回相同的内容。


区别

let difference = arr1.filter(x => !arr2.includes(x));

右差维恩图

对于 [1,2,3] [2,3] 它将产生 [1] 。另一方面,对于 [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])

原文由 Luis Sieira 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题