如何在JavaScript中组合多个数组?

时间:2019-05-29 20:07:20

标签: javascript arrays

我想将多个数组组合成一个数组。

我尝试了 lodash 库的_.zip,但这不是我想要的。

这是数组:

var arr1 = [
    'a', 'b'
];
var arr2 = [
    'c', 'd'
];
var arr3 = [
    'e'
];

我想要这个输出:

var result = [
    ['a', 'c', 'e'],
    ['a', 'd', 'e'],
    ['b', 'c', 'e'],
    ['b', 'd', 'e']
];

4 个答案:

答案 0 :(得分:3)

如果您希望始终拥有相同数量的数组,虽然有点多余,但我发现它更具可读性:

let arr1 = [
  'a', 'b'
];
let arr2 = [
  'c', 'd'
];
let arr3 = [
  'e'
];

let result = arr1.flatMap(one =>
    arr2.flatMap(two =>
        arr3.map(three => [one, two, three])));
console.log(result);

如果您不总是希望有3个数组,或者希望使用泛型函数将任意数量的数组相乘:

let arr1 = [
  'a', 'b'
];
let arr2 = [
  'c', 'd'
];
let arr3 = [
  'e'
];

let multiply = (...arrays) =>
    arrays.reduce((results, array) =>
        results.flatMap(result => array.map(a => [...result, a])), ['']);

let results = multiply(arr1, arr2, arr3);
console.log(results);

答案 1 :(得分:2)

您可以使用给定数组的笛卡尔积的函数。

const cartesian = (...p) =>
        p.reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []));

var a = ['a', 'b'],
    b = ['c', 'd'],
    c = ['e'];
    result = cartesian(a, b, c);

result.forEach(a => console.log(...a));

答案 2 :(得分:0)

正如其他人所指出的,这称为数组的笛卡尔积。我发现通过将(reducing)折叠成一个采用两个数组的乘积的形式来构建它更容易。

const product = (xs, ys) => 
  xs .flatMap (x => ys .map (y => [x, y] .flat () ) )

const productAll = (...xss) => 
  xss .reduce (product)

console .log (
  productAll ( ['a', 'b'], ['c', 'd'], ['e'])
)

如果您的环境不support flat and flatmap,则很容易进行填充。

如果要在一个数组[['a', 'b'], ['c', 'd'], ['e']]中而不是单独提供数组,只需将...xss替换为xss

答案 3 :(得分:0)

许多人已经提到您的问题是this question的重复。因此,您可能需要在这里寻找推荐的解决方案。

我只是想添加另一个可以任意组合的功能解决方案。 listProduct函数在这种情况下的类型为listProduct :: [[a]] -> [a] -> [[a]],表示它(至少)将二维数组作为其第一个参数并返回一个。这就是为什么需要singletonize函数将第一个数组转换为二维数组的原因。

如下所示,如果需要,您可以轻松地组合对此函数的调用以获得n(n≥2)列表的乘积。

const singletonize = l => l.map(x => [x])
const listProduct = (ls, list) => 
  ls.reduce((r, l) => {
      combinations = list.map(x => l.concat(x))
      return r.concat(combinations)
  }, [])
  
// The three arrays of your example
const a_1 = ['a', 'b'];
const a_2 = ['c', 'd'];
const a_3 = ['e'];
console.log(listProduct(listProduct(singletonize(a_1), a_2), a_3))

// Another example with five arrays
const a_4 = ['f', 'g', 'h'];
const a_5 = ['i'];

console.log(listProduct(listProduct(listProduct(listProduct(singletonize(a_1), a_2), a_3), a_4), a_5))