【问题标题】:merging 2 multidimensional arrays at the same index在同一索引处合并 2 个多维数组
【发布时间】:2017-11-05 04:39:57
【问题描述】:

javascript

我正在尝试在同一索引处合并 2 个多维数组,或者将两个数组的同一索引随机化。

var arr1 = [[a, b, c], [d, e], [f, g, h, i]]
var arr2 = [[1, 2, 3], [5, 6], [7, 8, 9, 10]]

preferredResult = [{a: 1, b: 2, c: 3}, {d: 5, e:6}, {f: 7, g: 8, h: 9, i: 10}]

我尝试过 .maps、嵌套 for 循环、.push 不同的变体,但无法弄清楚。

或者,如果我能弄清楚如何以相同的方式随机化两个数组数组,那也可以,即:arr1[0] 中的字母和 arr2[0] 中的数字可以设置为相同的随机化,然后是 arr1[1] & arr2[1] 等等。

【问题讨论】:

  • 您的首选结果应该是[ {a: 1, b: 2, c: 3}, {d: 5, e:6}, {f: 7, g: 8, h: 9, i: 10}]。内部元素应该是对象,而不是数组。
  • 啊,是的,谢谢。
  • 处理二维列表的最简单方法是使用嵌套循环。外层循环遍历顶层数组中的每一项,内层循环遍历二级数组中的每一项。

标签: javascript


【解决方案1】:
function merge(arr1, arr2) {
   return arr1.map(function (arr, i) {
      return mergeIntoObject(arr1[i], arr2[i])); 
   };
}

function mergeIntoObject(arr1, arr2) {
  var result = {};
  arr1.forEach((arr, i) => {
    result[arr1[i]] = arr2[i];
  });
  return result;
}

merge(arr1, arr2);

【讨论】:

    【解决方案2】:

    您可以使用array#maparray#reduce

    const arr1 = [['a', 'b', 'c'], ['d','e' ], ['f', 'g', 'h', 'i']],
          arr2 = [[1, 2, 3], [5, 6], [7, 8, 9, 10]],
          result = arr1.map(function(a, i){
            return a.reduce(function(r, v, j){
              r[v] = arr2[i][j];
              return r;
            }, {});
          });
          
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      使用map & forEach 方法

      var arr1 = [
          ['a', 'b', 'c'],
          ['d', 'e'],
          ['f', 'g', 'h', 'i']
        ],
        arr2 = [
          [1, 2, 3],
          [5, 6],
          [7, 8, 9, 10]
        ],
        m = arr1.map(function(item, index) {
          let tempObj = {};
          item.forEach(function(item2, index2) {
            tempObj[item2] = arr2[index][index2];
          });
          return tempObj;
        });
      console.log(m)

      【讨论】:

        【解决方案4】:

        使用嵌入式for 循环

        var arr1 = [['a', 'b', 'c'], ['d', 'e'], ['f', 'g', 'h', 'i']]
        var arr2 = [[1, 2, 3], [5, 6], [7, 8, 9, 10]]
        
        var result = []
        for (let i = 0; i < arr1.length; i++){
            let obj = {};
            for (let j = 0; j < arr1[i].length; j++){
                obj[arr1[i][j]]=arr2[i][j]
            }
            result.push(obj);
        }
        console.log(result)

        【讨论】:

        • 它正在为 arr1 中的每个元素创建对象
        【解决方案5】:

        Lodash 非常有用。

        var arr1 = [['a', 'b', 'c'], ['d', 'e'], ['f', 'g', 'h', 'i']]
        var arr2 = [[1, 2, 3], [5, 6], [7, 8, 9, 10]]
        
        var out = _.zipWith(arr1, arr2, (x,y)=>_.fromPairs(_.zip(x,y)));
        console.log(out)
          
        &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"&gt;&lt;/script&gt;

        zip 会将 2 个数组组合成对,而 zipWith 也会这样做,但您可以选择如何组合它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-08
          • 2021-04-20
          • 2012-01-23
          • 1970-01-01
          • 2020-09-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多