Javascript 如何.concat至少有一个相同元素的多个数组?

Javascript 如何.concat至少有一个相同元素的多个数组?,javascript,arrays,Javascript,Arrays,我花了两个小时研究这个算法,到目前为止运气不好,不断陷入许多混乱的嵌套for循环和最大堆栈 这就是目标 给定一个2D数组的输入: [[1,7],[1,3],[9,7],[2,4]] 我希望输出再次是2D数组,但它们将至少有一个元素的元素(来自输入数组)组合在一起,就像连接点一样,至少有一个元素等于另一个元素 因此输出类似于 [[1,7,1,3,9,7],[2,4]] 为什么??因为 我们可以将[1,7]与[1,3]连接起来,它们有1的共同点 我们可以将[1,7]与[9,7]连接起来,它们有

我花了两个小时研究这个算法,到目前为止运气不好,不断陷入许多混乱的嵌套
for
循环和
最大堆栈

这就是目标

给定一个2D数组的输入:

[[1,7],[1,3],[9,7],[2,4]]
我希望输出再次是2D数组,但它们将至少有一个元素的元素(来自输入数组)组合在一起,就像连接点一样,至少有一个元素等于另一个元素

因此输出类似于

[[1,7,1,3,9,7],[2,4]]
为什么??因为

  • 我们可以将
    [1,7]
    [1,3]
    连接起来,它们有
    1
    的共同点
  • 我们可以将
    [1,7]
    [9,7]
    连接起来,它们有
    7
    的共同点
  • 我们无法将
    [2,4]
    连接到任何东西,因为我们没有任何通用的
    2
    4
比如说

var input = [[1,7],[1,3],[9,7],[2,4]];
var output = (function(input) {
   // something i couldn't figure out
   // return = [[1,7,1,3,9,7],[2,4]]
})(input);
// as simple as that

您可以使用
reduce
方法创建新数组,并在每次迭代中使用
findIndex
some
方法检查累加器值,查看某个子数组是否包含当前数组中的某个元素

const data=[[1,7]、[1,3]、[9,7]、[2,4];
常数数据2=[[50]、[1,7]、[1,3]、[9,7]、[11,12]、[22,13]、[40100]、[11,40]、[50,13]、[50,13,100]]
const connect=(输入,重复=真)=>{
返回输入.reduce(函数(r、e、i、arr){
如果(!r.length)r.push(e);
否则{
let index=r.findIndex(a=>a.some(el=>e.includes(el));
索引!=-1?r[index].push(…e):r.push(e)
}
如果(重复)r=connect(r,false)
返回r;
}, [])
}
让结果=连接(数据)
console.log(JSON.stringify(结果))
让result2=connect(数据2)

console.log(JSON.stringify(result2))
通常,当您遇到许多嵌套for循环和最大堆栈错误时,这是因为您的问题最好递归解决。不使用递归也可以做到这一点,但使用递归要容易得多

const input=[[1,7],[1,3],[9,7],[2,4]]
const output=(_input)=>{
    const first=_input[0]
    const match=_input.slice(1).findIndex(_sub=>_sub.some(_element=>first.includes(_element)))
    if(match==-1){
        if(_input.length<=2){
            return _input
        }
        return [first,...output(_input.slice(1))]
    }
    const joined=[first.concat(_input[match+1]),..._input.slice(1,match+1),..._input.slice(match+2)]
    return output(joined)
}

console.log(output(input)) //[[1,7,1,3,9,7],[2,4]]
const input=[[1,7]、[1,3]、[9,7]、[2,4]]
常量输出=(_输入)=>{
const first=_输入[0]
常量匹配=_input.slice(1).findIndex(_sub=>_sub.some(_element=>first.includes(_element)))
如果(匹配==-1){

如果(_input.length)请将您的问题与上一个代码集成替换
//使用
返回[[1,7,1,3,9,7],[2,4]];
输入的
[[1,7],[1,3],[9,7],[2,4],[4,9]]的预期输出是什么[[1,7,1,3,9,7,2,4,4,9]
?关于
[[1,2,3],[3,4],[4,5]
?这会给我们
[[1,2,3,3,4],[3,4,4],[3,4,4,5]
?关键是分组所有连接的,如连接点或路径,如果输入
[[1,7],[1,3],[9,7],[2,4],[4,9]
,那么输出应该是
[1,4,4]
不是另一个,如果输入是
[[1,2,3],[3,4],[4,5]
那么应该是
[[1,2,3,3,3,4,4,5]
。尝试此输入
[[1,7],[1,3],[9,7],[2,4],[4,9]
输出不是预期的,您的代码将输出
[[1,7,1,3,9,7,4,9],[2,4]
,这不是预期的[[1,7,1,3,9,7,4,9,2,4]
[[1,7,1,3,9,7,2,4,4,9]]
,元素的顺序在这里并不重要,只要像连接的网络或路径一样分组。我尝试使用
reduce
一些
甚至
映射
,但没有运气,在算法上卡住了,我的大脑在试图找出正确的算法时爆炸了。@xcode实际上在这种情况下它不起作用,但是如果你每次都重复它那个时候它似乎起作用了