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

时间:2017-12-31 12:35:21

标签: javascript arrays

到目前为止,我一直在研究这个算法几个小时但没有运气,继续陷入许多令人困惑的嵌套for循环和maximum stack

这是目标,

鉴于输入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]与任何内容联系起来,因为我们没有任何常见的24

所以,例如

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

2 个答案:

答案 0 :(得分:4)

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



const data = [[1,7],[1,3],[9,7],[2,4]];
const data2 = [[50], [1,7],[1,3],[9,7],[11,12],[22, 13], [40, 100], [11, 40], [50, 13], [50, 13, 100]]

const connect = (input, repeat = true) => {
  return input.reduce(function(r, e, i, arr) {
    if (!r.length) r.push(e);
    else {
      let index = r.findIndex(a => a.some(el => e.includes(el)));
      index != -1 ? r[index].push(...e) : r.push(e)
    }
    if (repeat) r = connect(r, false)
    return r;
  }, [])
}


let result = connect(data)
console.log(JSON.stringify(result))

let result2 = connect(data2)
console.log(JSON.stringify(result2))




答案 1 :(得分:0)

通常,当您遇到许多嵌套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]]

我还用xcodes测试了这个&#39;在他对Nenad的评论中列出。