我的用例的 JS 列表交集
Posted
技术标签:
【中文标题】我的用例的 JS 列表交集【英文标题】:JS List intersection for my use case 【发布时间】:2011-11-05 07:33:06 【问题描述】:我是一个 javascript 新手,所以请多多包涵。我有这样的清单:
var list1 = ['a','b','c'];
var list2 = ['c','d','e'];
var list3 = ['f','g'];
如您所见,list1 和 list2 在 'c' 处相交,而 list3 与 list1 和 list2 不相交。 结果应该是
['a','b','c','d','e'],['f','g'] // Two arrays
我们将 list1 和 list2 组合在一起,因为它们相交,而 list3 保持原样。另一个例子:
var list1 = ['a','b','c'];
var list2 = ['d','e','f'];
var list3 = ['f','g','a'];
这里我们看到list1 和list2 不相交,list1 在'a' 处与list3 相交,而list2 在'f' 处与list3 相交。因此,由于所有 3 个相交,返回的结果将是:
['a','b','c','d','e','f','g'] // One array
感谢任何帮助 卡
PS:我确实在网站上搜索过类似的问题,我遇到了一个intersection of n lists via JS,它很相似,但不适用于我的用例。
【问题讨论】:
【参考方案1】:如果你有两个列表的交集和联合函数,你可以用这个逻辑得到你想要的:
var lists; // initialized with the lists you want to process
var merged = [];
for each list a in lists
for each list b in merged
if intersect(a,b) != empty
remove b from merged;
a = union(a,b);
add a to merged;
在循环遍历所有合并的元素时,您只需要小心从合并中删除 b 即可。迭代从最后一个元素到第一个元素的合并可能更简单。 underscore library 是查找交集和并集函数的好地方。
【讨论】:
我在纸上试过你的 sudo 代码,它似乎工作!我的小脑袋不可能处理这个:) 我不明白的一件事是你担心从合并中删除 b 并在合并时从最后一个迭代到第一个。你能解释一下吗?为伪代码竖起大拇指(尝试这样做但没有足够的声誉:()。 假设您通过递增索引i
循环遍历merged
,您需要删除元素b
(位于i
位置)。通常,您可以通过将merged
的最后一个元素移动到i
并将列表长度缩短一来实现。如果您在循环的同一遍中增加i
,那么您将跳过测试最后一个元素(现在是b
曾经所在的位置)。从末尾开始并递减索引可以避免这个问题。
我今天试用了伪代码,它运行良好!谢谢泰德。【参考方案2】:
试试
<script>
Array.prototype.unique = function()
var temp = , len = this.length;
for(var i=0; i < len; i++)
if(typeof temp[this[i]] == "undefined")
temp[this[i]] = 1;
this.length = 0;
len = 0;
for(var i in temp)
this[len++] = i;
return this;
var list1 = ['a','b','c'];
var list2 = ['c','d','e'];
var list3 = ['f','g'];
start = new Date().getTime();
var list = list1.concat(list2).concat(list3).unique();
</script>
【讨论】:
在第一个示例中,您不会像 OP 所希望的那样从中得到两个数组。以上是关于我的用例的 JS 列表交集的主要内容,如果未能解决你的问题,请参考以下文章