到目前为止,我一直在研究这个算法几个小时但没有运气,继续陷入许多令人困惑的嵌套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]
与任何内容联系起来,因为我们没有任何常见的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
答案 0 :(得分:4)
您可以使用reduce
方法创建新数组,并在每次迭代中检查累加器值,以查看某个子数组是否包含使用findIndex
和some
方法的当前数组中的某些元素
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的评论中列出。