Javascript 我的用例的JS列表交叉点

Javascript 我的用例的JS列表交叉点,javascript,list,intersection,Javascript,List,Intersection,我是一个javascript新手,请容忍我。我的清单如下: var list1 = ['a','b','c']; var list2 = ['c','d','e']; var list3 = ['f','g']; 如您所见,列表1和列表2在“c”处相交,而列表3与列表1和列表2不相交。 结果应该是 ['a','b','c','d','e'],['f','g'] // Two arrays 我们合并了列表1和列表2,因为它们在保持列表3不变的同时相交。另一个例子: var list1 = ['

我是一个javascript新手,请容忍我。我的清单如下:

var list1 = ['a','b','c'];
var list2 = ['c','d','e'];
var list3 = ['f','g'];
如您所见,列表1和列表2在“c”处相交,而列表3与列表1和列表2不相交。
结果应该是

['a','b','c','d','e'],['f','g'] // Two arrays
我们合并了列表1和列表2,因为它们在保持列表3不变的同时相交。另一个例子:

var list1 = ['a','b','c'];
var list2 = ['d','e','f'];
var list3 = ['f','g','a'];
这里我们看到list1和list2不相交,list1和list3在“a”处相交,list2和list3在“f”处相交。因此,由于所有3个相交,因此返回的结果将是:

['a','b','c','d','e','f','g'] // One array
感谢您的帮助
KA

PS:我在网站上搜索了一个类似的问题,我遇到了一个类似的问题,但不适用于我的用例。

试试看

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

Array.prototype.unique=函数(){
var temp={},len=this.length;
对于(var i=0;i
如果您有两个列表交集和并集函数,则可以使用此逻辑获得所需的内容:

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。从最后一个元素迭代到第一个元素可能更简单。
这是一个很好的找到交集和并集函数的地方。

在第一个示例中,OP不希望从中得到两个数组。我在纸上尝试了你的sudo代码,它似乎有效!我的小脑袋不可能处理这个:)有一件事我不明白,那就是你担心从合并中删除b,并在合并时从最后一个迭代到第一个。你能解释一下吗?尽管如此,还是对伪代码竖起了大拇指(尝试这样做,但没有足够的声誉:()。假设通过增加索引
i
来循环
merged
,并且需要删除元素
b
(位于
i
)。通常,您可以将
merged
的最后一个元素移动到
i
并将列表长度缩短1。如果在循环的同一过程中增加
i
,则您将跳过测试上一个元素(现在是
b
的位置).从末尾开始,递减索引可以避免这个问题。我今天试用了伪代码,效果非常好!谢谢Ted。