Javascript JS-合并至少共享一个公共值的数组

Javascript JS-合并至少共享一个公共值的数组,javascript,arrays,Javascript,Arrays,如果我有以下数组: var myArr = [[0, 1, 2], [1, 2, 6], [9, 10], [10, 11], [11, 12], [13]]; 如何合并至少共享一个公共值的数组以生成以下输出 var myMergedArr = [[0, 1, 2, 6], [9, 10, 11, 12], [13]]; 谢谢 注意:它们并不总是被很好地排序,而且当所有东西都被排序时,共享值可能并不总是开始/结束值。为了清晰起见,我对上述值进行了排序。可以使用空数组(合并的)作为起始值来减少

如果我有以下数组:

var myArr = [[0, 1, 2], [1, 2, 6], [9, 10], [10, 11], [11, 12], [13]];
如何合并至少共享一个公共值的数组以生成以下输出

var myMergedArr = [[0, 1, 2, 6], [9, 10, 11, 12], [13]];
谢谢


注意:它们并不总是被很好地排序,而且当所有东西都被排序时,共享值可能并不总是开始/结束值。为了清晰起见,我对上述值进行了排序。

可以使用空数组(
合并的
)作为起始值来减少数组。对于
myArray
中的每个数组,
现有的
被定义为一个
子数组
s的数组,其中
子数组
数组
的交集不为空

如果找不到这样的数组,
现有的
将保持未定义状态,新数组(包含在另一个数组中)将被定义为
现有的
,并被推到
合并的

如果找到多个匹配项(
existing.slice(1)
不为空),则需要将它们合并在一起:
existing[0]
充当合并所有其他子数组(
existing[1..]
)的容器(无重复项)。然后需要在
merged
中找到这些进一步的匹配项并将其删除,因为它们已经被合并。这保证了如果多个阵列属于同一个阵列,即使它们之前没有合并,也可以合并

然后,如果
数组
中的每个项尚未包含,则将其推送到
现有[0]
。最后,返回合并的。然后
reduce
的下一次迭代可以再次将
merged
作为第一个参数,并继续使用
myArr
中的下一个数组

这是ES6的代码。如果需要,您可以将其传输并填充到ES5

var myArr=[
[0, 1, 2],
[1, 2, 6],
[9, 10],
[10, 11],
[11, 12],
[13]
],
myMergedArr=myArr.reduce((合并,数组)=>{
让existing=merged.filter((子数组)=>subArray.filter((子项)=>array.includes(子项)).length);
如果(!existing.length){
现有=[
[]
];
合并.推送(现有[0]);
}
否则{
现有.slice(1).forEach((进一步数组)=>{
forEach((项目)=>{
如果(!现有[0]。包括(项)){
现有[0]。推送(项);
}
});
merged.splice(merged.findIndex((子数组)=>furtherArray==子数组),1);
});
}
array.forEach((项)=>{
如果(!现有[0]。包括(项)){
现有[0]。推送(项);
}
});
返回合并;
}, []);

console.log(myMergedArr)
可以使用空数组(
合并的
)作为起始值来减少数组。对于
myArray
中的每个数组,
现有的
被定义为一个
子数组
s的数组,其中
子数组
数组
的交集不为空

如果找不到这样的数组,
现有的
将保持未定义状态,新数组(包含在另一个数组中)将被定义为
现有的
,并被推到
合并的

如果找到多个匹配项(
existing.slice(1)
不为空),则需要将它们合并在一起:
existing[0]
充当合并所有其他子数组(
existing[1..]
)的容器(无重复项)。然后需要在
merged
中找到这些进一步的匹配项并将其删除,因为它们已经被合并。这保证了如果多个阵列属于同一个阵列,即使它们之前没有合并,也可以合并

然后,如果
数组
中的每个项尚未包含,则将其推送到
现有[0]
。最后,返回合并的。然后
reduce
的下一次迭代可以再次将
merged
作为第一个参数,并继续使用
myArr
中的下一个数组

这是ES6的代码。如果需要,您可以将其传输并填充到ES5

var myArr=[
[0, 1, 2],
[1, 2, 6],
[9, 10],
[10, 11],
[11, 12],
[13]
],
myMergedArr=myArr.reduce((合并,数组)=>{
让existing=merged.filter((子数组)=>subArray.filter((子项)=>array.includes(子项)).length);
如果(!existing.length){
现有=[
[]
];
合并.推送(现有[0]);
}
否则{
现有.slice(1).forEach((进一步数组)=>{
forEach((项目)=>{
如果(!现有[0]。包括(项)){
现有[0]。推送(项);
}
});
merged.splice(merged.findIndex((子数组)=>furtherArray==子数组),1);
});
}
array.forEach((项)=>{
如果(!现有[0]。包括(项)){
现有[0]。推送(项);
}
});
返回合并;
}, []);
console.log(myMergedArr)A似乎非常适合您的情况:

函数合并(数组){
var ds=新的分离集();
forEach(函数(数组){
array.reduce(函数(prevSet,currentValue){
var currentSet=ds.getSet(currentValue);
if(prevSet)prevSet.mergeWith(currentSet);
返回电流集;
},假);
});
返回ds.partitions();
}
var myArr=[[0,1,2]、[1,2,6]、[9,10]、[10,11]、[11,12]、[13];
log(JSON.stringify(merge(myArr))
/*分离集库*/
类MySet{
建造商(业主){
这个.rank=0;
this.parent=this;
this.owner=所有者;
}
代表(){
var parent=this.parent;
如果(this==父项)返回此;
而(parent!==(parent=parent.parent));
this.parent=parent;/*路径压缩*/
返回父母;
}
合并(其他){
var r1=this.representative(),
r2=其他。代表();
如果(r1==r2)返回;
如果(r1.owner!==r2.owner)抛出新错误(“无法删除”)