Javascript 创建相交值的数组

Javascript 创建相交值的数组,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,以下是一些值数组: values = [ [1,2,3], [2,3,4], [8,9,10], [9,10,11], [13,14,15] ]; 当两个或多个数组的值相交时,我想创建数组值并集的新数字排序数组 这些新排序数组中的值将是唯一的 如果一个数组不与任何其他数组相交,那么我们将该数组包括在结果中,例如示例中的[13,14,15] 例如: clusters = [ [1,2,3,4], [8,9,10,11], [13,14,15] ]; 由于值[0]

以下是一些值数组:

values = [
  [1,2,3],
  [2,3,4],
  [8,9,10],
  [9,10,11],
  [13,14,15]
];
当两个或多个数组的值相交时,我想创建数组值并集的新数字排序数组

这些新排序数组中的值将是唯一的

如果一个数组不与任何其他数组相交,那么我们将该数组包括在结果中,例如示例中的[13,14,15]

例如:

clusters = [
  [1,2,3,4],
  [8,9,10,11],
  [13,14,15]
];
由于值[0]和值[1]相交,我们将它们的值的并集添加到集群中

由于值[2]和值[3]相交,我们将它们的值的并集添加到集群中

由于值[4]没有将值[0]与值[4]相交,所以我们只将值[5]添加到集群中

现在,如果有一个值[6]=[3100],那么我们的集群将如下所示:

clusters = [
  [1,2,3,4,100],
  [8,9,10,11],
  [13,14,15]
];
因为值[6]与值[0]和值[1]相交,所以我们将它们的并集相加

有没有一种技术或最佳方法可以做到这一点


在我的示例中,对原始数组进行了排序,但可能不一定是这样。

要查看两个数组是否相交,一种简单的方法是将两个数组的集合大小与每个数组的集合大小进行比较,如果我们知道它们相交,则比较它们的大小

下面是一个例子

常量值=[ [1,2,3], [8,9,10], [2,3,4], [9,10,11], [13,14,15] ]; 函数ArrayIntersecta,b{ 返回新集合[…a,…b]。大小== 新Seta.size+新Setb.size; } 函数连接相交{ 常数a=[…v];//复制一份 对于设l=0;lconsole.logjoinIntersectionsvalues 要查看两个数组是否相交,一个简单的方法是将两个数组的集合大小与每个数组的集合大小进行比较,如果有不同的数组,我们知道它们相交

下面是一个例子

常量值=[ [1,2,3], [8,9,10], [2,3,4], [9,10,11], [13,14,15] ]; 函数ArrayIntersecta,b{ 返回新集合[…a,…b]。大小== 新Seta.size+新Setb.size; } 函数连接相交{ 常数a=[…v];//复制一份 对于设l=0;lconsole.logjoinIntersectionsvalues 下面是一个已编辑的代码段,用于响应使用的注释,使用传递的数组的副本作为累加器的种子,并且仍然使用some和include查找重复项

reduceRight反向迭代数组,而findIndex从头开始搜索。当找到匹配项时,当前迭代数组被推送到匹配数组,然后使用splice从累加器中删除当前元素

函数簇复制器{ 返回arr .reduceRighta,arr,i=>{ 如果我{ 设j=a.slice0,i.findIndex_arr=>arr.somex=>\u arr.includesx; 如果~j{ a[j].推……推; a、 第一,1; } } 归还 },[…啊] .maparr=>[…新Setarr].sorta,b=>a-b; } logclusterDuplicates[1,2,3],[3,4,2],[8,9,10],[9,11,10],[14,13,15]; logclusterDuplicates[[1,2],[3,4],[2,3];
.as console wrapper{max height:100%!important;top:0;}这里是一个已编辑的代码段,用于响应注释,使用传递数组的副本为累加器设定种子,并且仍然使用some和include查找重复项

reduceRight反向迭代数组,而findIndex从头开始搜索。当找到匹配项时,当前迭代数组被推送到匹配数组,然后使用splice从累加器中删除当前元素

函数簇复制器{ 返回arr .reduceRighta,arr,i=>{ 如果我{ 设j=a.slice0,i.findIndex_arr=>arr.somex=>\u arr.includesx; 如果~j{ a[j].推……推; a、 第一,1; } } 归还 },[…啊] .maparr=>[…新Setarr].sorta,b=>a-b; } logclusterDuplicates[1,2,3],[3,4,2],[8,9,10],[9,11,10],[14,13,15]; logclusterDuplicates[[1,2],[3,4],[2,3]; .as控制台包装{max height:100%!important;top:0;}用于循环和每个子数组,最后检查前一个数组是否有交集。如果相交,则将合并的数组添加到结果中

值=[ [1, 2, 3], [2, 3, 4], [8, 9, 10], [9, 10, 11], [13, 14, 15], ]; const intersect=arr1,arr2=>{ constboth=[…arr1,…arr2]; const uniq=[…新设置]; 返回uniq.length!==both.length?uniq:null; }; const compact=arrArr=>{ 如果arrArr?长度<2{ 返回arrArr; } 常数res=[]; L et last=arrArr[0]; 对于let i=1;i 值=[ [1, 2, 3], [2, 3, 4], [8, 9, 10], [9, 10, 11], [13, 14, 15], ]; const intersect=arr1,arr2=>{ constboth=[…arr1,…arr2]; const uniq=[…新设置]; 返回uniq.length!==both.length?uniq:null; }; const compact=arrArr=>{ 如果arrArr?长度<2{ 返回arrArr; } 常数res=[]; 设last=arrArr[0]; 对于let i=1;iconsole.logcompactvaluesIs[2,3,4,1]群集[0]的结果是否可以接受?@SebastianSimon群集应该进行排序,我将澄清操作如果两个数组包含[2,1]和[1,3]?合并的数组应该是[2,1,3]还是[1,2,3]?“排序”是指数值排序还是基于原始数组?@SebastianSimon是数值排序,所以[1,2,3]我几乎有一个有效的O n logn算法只通过所有元素和后续排序,但在类似[[1,2],[3,4],[2,3]]的情况下,它不会生成最终结果:Array.fromnew Setvalues.reducer,a=>{a.forEache=>{ifr.hasa{r.geta.pushe;}else ifr.hase{r.seta,r.gete.gete.pushe;}else{r.sete,a;};return r;},new Map.values,a=>Array.fromnew Seta.sorta,b=>a-b;。[2,3,4,1]对于簇[0]来说是一个可接受的结果吗?@SebastianSimon簇应该被排序,我将澄清这个问题,如果两个数组包含[2,1]和[1,3]会怎么样?合并的数组应该是[2,1,3]还是[1,2,3]?“排序”是指数值排序还是基于原始数组?@SebastianSimon是数值排序,所以[1,2,3]我几乎有一个有效的O n logn算法只通过所有元素和后续排序,但在类似[[1,2],[3,4],[2,3]]的情况下,它不会生成最终结果:Array.fromnew Setvalues.reducer,a=>{a.forEache=>{ifr.hasa{r.geta.pushe;}else ifr.hase{r.seta,r.gete.gete.pushe;}else{r.sete,a;};return r;},new Map.values,a=>Array.fromnew Seta.sorta,b=>a-b@SebastianSimon是的,不是100%确定这里的交点是什么意思,。。仔细观察输出,我假设OP意味着将连续的值保持在一起。我已更新以执行此操作。抱歉,我已将OP更新为clarify@jedierikb啊,对了,现在有道理了。。。我已经更新了我的答案。@SebastianSimon是的,它可以在这里进行优化,在数组加入的情况下不只是迭代。如果这个数据集可能是大的,我肯定会考虑优化。同样的问题在这里:[[ 1, 2 ],[3, 4 ],[2, 3 ] ]被分成[[ 1, 2, 3 ],[4] ],但是调用它的另一个时间,结果将它合并到预期的[ [1, 2, 3,4 ] ]中。不是100%确定这里的交点是什么意思,。。仔细观察输出,我假设OP意味着将连续的值保持在一起。我已更新以执行此操作。抱歉,我已将OP更新为clarify@jedierikb啊,对了,现在有道理了。。。我已经更新了我的答案。@SebastianSimon是的,它可以在这里进行优化,在数组加入的情况下不只是迭代。如果这个数据集可能是大的,我肯定会考虑优化。同样的问题在这里:[[ 1, 2 ],[3, 4 ],[2, 3 ] ]被分成[[ 1, 2, 3 ],[4] ],但是调用它在结果上的另一个时间将它合并到预期[[ 1, 2, 3,4 ] ]中。