【问题标题】:Multiplying 2 Arrays in JavaScript在 JavaScript 中将 2 个数组相乘
【发布时间】: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},
]

有没有一种简洁的方法来实现这个输出而不是嵌套循环

【问题讨论】:

  • 你能把一些逻辑封装在一个函数中吗?不会改变复杂性,但可以提高可读性。
  • 嗯,可能,但大多数好的解决方案都会包含某种形式的嵌套循环。
  • 嵌套数据的嵌套循环没有错……

标签: javascript arrays reactjs ecmascript-6 javascript-objects


【解决方案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)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多