我的用例的 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 列表交集的主要内容,如果未能解决你的问题,请参考以下文章

以下使用 Hadoop 生态系统的用例的最佳方法是啥?

自我总结:用例的可配置

js Array 交集 并集 差集 去重

字典列表,按列表键分组,没有交集

倒排列表求交集算法 包括baeza yates的交集算法

如何找到列表交集?