为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

子衿沉夜 2019-08-08 10:26:52
使用Javascript数组计算集合差异的最快或最优雅的方法是什么?让我们A和B两套。我正在寻找真正快速或优雅的方法来计算它们之间的集合差异(A - B或者A \B,取决于您的偏好)。正如标题所说,这两个集合作为Javascript数组进行存储和操作。笔记:壁虎特有的技巧是可以的我更喜欢坚持本机功能(但如果速度更快,我会对轻量级库开放)我见过,但没有经过测试,JS.Set(见前一点)编辑:我注意到有关包含重复元素的集合的注释。当我说“set”时,我指的是数学定义,这意味着(除其他外)它们不包含重复元素。
查看完整描述

3 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

如果不知道这是否最有效,但也许是最短的

A = [1, 2, 3, 4];B = [1, 3, 4, 7];diff = A.filter(function(x) { return B.indexOf(x) < 0 })console.log(diff);

已更新至ES6:

A = [1, 2, 3, 4];B = [1, 3, 4, 7];diff = A.filter(x => !B.includes(x) );console.log(diff);


查看完整回答
反对 回复 2019-08-08
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

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))); 


console.log([...a_minus_b]) // {1}

console.log([...b_minus_a]) // {5}

console.log([...a_intersect_b]) // {2,3,4}


查看完整回答
反对 回复 2019-08-08
?
烙印99

TA贡献1829条经验 获得超13个赞

您可以将对象用作地图,以避免线性扫描B每个元素,Auser187291的答案

function setMinus(A, B) {
    var map = {}, C = [];

    for(var i = B.length; i--; )
        map[B[i].toSource()] = null; // any other value would do

    for(var i = A.length; i--; ) {
        if(!map.hasOwnProperty(A[i].toSource()))
            C.push(A[i]);
    }

    return C;}

非标准toSource()方法用于获取唯一的属性名称; 如果所有元素都已经具有唯一的字符串表示(如数字的情况),则可以通过删除toSource()调用来加速代码。


查看完整回答
反对 回复 2019-08-08
  • 3 回答
  • 0 关注
  • 889 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信