在 JavaScript 中将 2 个数组相乘
Posted
技术标签:
【中文标题】在 JavaScript 中将 2 个数组相乘【英文标题】:Multiplying 2 Arrays in JavaScript 【发布时间】:2019-07-02 01:14:28 【问题描述】:我有 2 个数组
array1 = ["a","b"]
array2 = [ ["1","2","3"],["10","11","12"]]
我想要的输出是一个对象数组
[
array1: a , array2: 1,
array1: a , array2: 2,
array1: a , array2: 3,
array1: b , array2: 10,
array1: b , array2: 11,
array1: b , array2: 12,
]
有没有一种简洁的方法来实现这个输出而不是嵌套循环
【问题讨论】:
你能把一些逻辑封装在一个函数中吗?不会改变复杂性,但可以提高可读性。 嗯,可能,但大多数好的解决方案都会包含某种形式的嵌套循环。 嵌套数据的嵌套循环没有错…… 【参考方案1】:看起来你只需要两个循环。有很多方法可以做到这一点。一种简洁的方法是将reduce
array1
和map
array2
放入外循环内的结果中:
let array1 = ["a","b"]
let array2 = [ ["1","2","3"],["10","11","12"]]
let res = array1.reduce((arr, array1, i) =>
arr.concat(array2[i].map(array2 => (array1, array2)))
, [])
console.log(res)
【讨论】:
【参考方案2】:您可以减少数组并获得每个数组外部元素的笛卡尔积。
function getCartesian(object)
return Object.entries(object).reduce((r, [k, v]) =>
var temp = [];
r.forEach(s =>
(Array.isArray(v) ? v : [v]).forEach(w =>
(w && typeof w === 'object' ? getCartesian(w) : [w]).forEach(x =>
temp.push(Object.assign(, s, [k]: x ))
)
)
);
return temp;
, []);
var array1 = ["a", "b"],
array2 = [["1", "2", "3"], ["10", "11", "12"]],
result = array1.reduce((r, a, i) =>
r.concat(getCartesian( array1: a, array2: array2[i] )), [])
console.log(result);
.as-console-wrapper max-height: 100% !important; top: 0;
【讨论】:
谢谢,但是您的解决方案提供了完整的笛卡尔积,我不需要,如果您看到我的问题,我只需要结果中的 6 个对象,而您的解决方案给了我 2x6 = 12,我需要"a" 与 "1","2" 和 "3" 而 "b" 与 "10","11" 和 "12"【参考方案3】:您可以只在第二个数组上使用map() 方法,然后在嵌套数组上使用另一个 map() 方法。最后,使用索引将第一个数组中的“nth”元素与“nth”嵌套数组中的元素组合在一个对象中,如下所示:
array1 = ["a","b"]
array2 = [ ["1","2","3"],["10","11","12"]]
let x = [];
array2.map((e,i) => // call function on every element in array2 with index callback
e.map((f,j) => // call function on every element in the nested arrays with index callback
let obj = ;
obj["array1"] = array1[i];
obj["array2"] = f;
x.push(obj);
);
);
console.log(x);
【讨论】:
【参考方案4】:这与 Marks Meyer 答案类似,但使用 forEach()
而不是 reduce()
。
let array1 = ["a","b", "c"];
let array2 = [["1","2","3"], ["10","11","12"]];
let res = [];
array1.forEach((x, i) =>
if (array2[i])
res.push(...array2[i].map(y => (array1: x, array2: y)));
);
console.log(res);
【讨论】:
【参考方案5】:您可以使用.map()
和.flat()
将array2
的每个元素映射到array1
的每个元素,然后展平生成的数组。
const array1 = ["a","b"]
const array2 = [ ["1","2","3"],["10","11","12"]]
let res = array1.map((array1, i) => array2[i].map(array2 => (array1, array2))).flat()
console.log(res)
【讨论】:
以上是关于在 JavaScript 中将 2 个数组相乘的主要内容,如果未能解决你的问题,请参考以下文章