使用Javascript数组计算集合差异的最快或最优雅的方法是什么?

2022-08-30 02:38:25

让和成为两套。我正在寻找非常快速或优雅的方法来计算它们之间的集合差异(或,取决于您的偏好)。正如标题所说,这两个集合被存储和操作为Javascript数组。ABA - BA \B

笔记:

  • 壁虎特有的技巧是可以的
  • 我更喜欢坚持使用本机函数(但是如果它更快,我对轻量级库持开放态度)
  • 我见过,但未经测试,JS。设置(请参阅上一点)

编辑:我注意到关于包含重复元素的集合的评论。当我说“set”时,我指的是数学定义,这意味着(除其他事项外)它们不包含重复的元素。


答案 1

我不知道这是否是最有效的,但也许是最短的:

var A = [1, 2, 3, 4];
var B = [1, 3, 4, 7];

var diff = A.filter(function(x) {
  return B.indexOf(x) < 0;
});

console.log(diff); // [2]

更新到 ES6:

const A = [1, 2, 3, 4];
const B = [1, 3, 4, 7];

const diff = A.filter(x => !B.includes(x));

console.log(diff); // [2]

答案 2

好吧,7年后,使用ES6的Set对象,它很容易(但仍然不像python那样紧凑),并且据报道比大型数组更快:A - BindexOf

console.clear();

let a = new Set([1, 2, 3, 4]);
let b = new Set([5, 4, 3, 2]);

let a_minus_b = new Set([...a].filter(x => !b.has(x)));
let b_minus_a = new Set([...b].filter(x => !a.has(x)));
let a_intersect_b = new Set([...a].filter(x => b.has(x))); 
let a_union_b = new Set([...a, ...b]); 

console.log(...a_minus_b);     // {1}
console.log(...b_minus_a);     // {5}
console.log(...a_intersect_b); // {2,3,4}
console.log(...a_union_b);     // {1,2,3,4,5}