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

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

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

笔记:

  • 壁虎特有的技巧是可以的

  • 我更喜欢坚持本机功能(但如果速度更快,我会对轻量级库开放)

  • 我见过,但没有经过测试,JS.Set见前一点)

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


子衿沉夜
浏览 899回答 3
3回答

斯蒂芬大帝

如果不知道这是否最有效,但也许是最短的A&nbsp;=&nbsp;[1,&nbsp;2,&nbsp;3,&nbsp;4];B&nbsp;=&nbsp;[1,&nbsp;3,&nbsp;4,&nbsp;7];diff&nbsp;=&nbsp;A.filter(function(x)&nbsp;{&nbsp;return&nbsp;B.indexOf(x)&nbsp;<&nbsp;0&nbsp;})console.log(diff);已更新至ES6:A&nbsp;=&nbsp;[1,&nbsp;2,&nbsp;3,&nbsp;4];B&nbsp;=&nbsp;[1,&nbsp;3,&nbsp;4,&nbsp;7];diff&nbsp;=&nbsp;A.filter(x&nbsp;=>&nbsp;!B.includes(x)&nbsp;);console.log(diff);

鸿蒙传说

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)));&nbsp;console.log([...a_minus_b]) // {1}console.log([...b_minus_a]) // {5}console.log([...a_intersect_b]) // {2,3,4}

烙印99

您可以将对象用作地图,以避免线性扫描B每个元素,A如user187291的答案:function&nbsp;setMinus(A,&nbsp;B)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;map&nbsp;=&nbsp;{},&nbsp;C&nbsp;=&nbsp;[]; &nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i&nbsp;=&nbsp;B.length;&nbsp;i--;&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[B[i].toSource()]&nbsp;=&nbsp;null;&nbsp;//&nbsp;any&nbsp;other&nbsp;value&nbsp;would&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i&nbsp;=&nbsp;A.length;&nbsp;i--;&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!map.hasOwnProperty(A[i].toSource())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C.push(A[i]); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;C;}非标准toSource()方法用于获取唯一的属性名称;&nbsp;如果所有元素都已经具有唯一的字符串表示(如数字的情况),则可以通过删除toSource()调用来加速代码。
打开App,查看更多内容
随时随地看视频慕课网APP