在 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 array1map 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 个数组相乘的主要内容,如果未能解决你的问题,请参考以下文章

在javascript中将数组分成3组[重复]

在javascript中组合2个数组

在 JavaScript 中将多个数组值作为 url 变量传递

质因数的个数

有没有办法在 C++ 中将字符串和整数相乘? [复制]

将 JavaScript 字符串解析为 2 个数组