将嵌套数组转换为单个数组

时间:2017-12-28 13:49:43

标签: javascript arrays mapping

任何人都可以帮我从现有阵列生成一个新阵列。这是我的数组(样本)

[
 1,
 2,
 [3,4],
 9
 [5,6],
 [7,8]
]

这就是我想要实现的目标

[
 [1,2,3,9,5,7],
 [1,2,4,9,5,7],
 [1,2,3,9,6,7],
 [1,2,4,9,6,7],
 [1,2,3,9,5,8],
 [1,2,4,9,5,8],
 [1,2,3,9,6,8],
 [1,2,4,9,6,8]
]

由于

编辑 因为我想要嵌套数组的正确组合。我不认为this question会有所帮助。

2 个答案:

答案 0 :(得分:1)

这看起来像Cartesian product所以你可以为它创建递归函数。



var data = [ 1, 2, [3,4], 9, [5,6], [7,8] ];

function convert(data, n = 0, c = [], r = []) {
  if(n == data.length) return r.push(c.slice());
  let el = Array.isArray(data[n]) ? data[n] : [data[n]]
  for(var i = 0; i < el.length; i++) {
    c[n] = el[i];
    convert(data, n + 1, c, r);
  }
  return r;
}

console.log(JSON.stringify(convert(data)))
&#13;
&#13;
&#13;

答案 1 :(得分:1)

另一种方法是从数据中的第一个元素创建第一个元素,然后在reduce()

中映射来自该基数的新数组

var data = [1, 2, [3, 4], 9, [5, 6],  [7, 8]];

const base = data.map(e => Array.isArray(e) ? e[0] : e);
const res = data.reduce((a, el, dIdx) => {
  if (Array.isArray(el)) {
    let newArrs = el.slice(1).map(nVal => {
      return [...a.map(arr => arr.map((val, i) => i === dIdx ? nVal : val))];
    })
    return a.concat(...newArrs)
  }
  return a;
}, [base]);

console.log(JSON.stringify(res))