Javascript 我的用例的JS列表交叉点
我是一个javascript新手,请容忍我。我的清单如下: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 = ['
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。