我想将多个数组组合成一个数组。
我尝试了 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']
];
答案 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))