【问题标题】:Convert nested Arrays to Object in javascript在javascript中将嵌套数组转换为对象
【发布时间】:2018-01-11 09:38:16
【问题描述】:

我正在处理一项涉及将数组转换为对象的任务,但我有点忙不过来。我们从一个数组开始,其中包含两个额外的嵌套数组,每个嵌套数组包含可变数量的数组(每个包含两个值)。

任务是将所有这些转换为一个数组,包含多个对象。在每个对象中,将有一系列键/值对,等于每个最小给定数组中的两个值。

例如

参数将如下所示:

[
  [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
  [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
]

鉴于该输入,返回值应如下所示:

[{firstName: 'Joe', lastName: 'Blow', age: 42, role: 'clerk'}, {firstName: 'Mary', lastName: 'Jenkins', age: 36, role: 'manager'}]

使用调试器,我确定我的代码正确地将键/值对分配给 return 语句中的第一个对象。但是,当循环继续时,不是创建新的嵌套对象,而是替换第一个对象的键/值对,因此我只得到一个对象,该对象具有来自最终评估的数组的正确键值对。

到目前为止,这是我的代码:

function transformEmployeeData(employeeData) {
  var obj = {}, arr = []
  for (var i = 0; i < employeeData.length; i ++) {
    for (var j = 0; j < employeeData[i].length; j ++) {
      var key = employeeData[i][j][0];
      var value = employeeData[i][j][1];
      obj[key] = value;
    }
    arr.push(obj);
  }
  return arr;
}

这个让我的大脑有点纠结......任何建议将不胜感激!!!

【问题讨论】:

    标签: javascript arrays object nested


    【解决方案1】:

    问题的更新和单行解决方案:

    const input = [
      [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
      [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
    ]
    
    const output = input.map(a => Object.fromEntries(a));
    
    console.log(output);

    Object.fromEntries() 已在 ECMAScript 2019 (ES10) 中引入

    在撰写本文时(2019 年 4 月 11 日),该方法已经被 Chrome 73 和 Firefox 63 实现。很快它将被主要浏览器的新版本实现。从版本 7.4.0 (core-js@3) 开始,该方法也可以在 BabelJs 中使用。

    【讨论】:

      【解决方案2】:

      除了在第一个循环内移动新对象的赋值之外,您可以考虑在函数顶部声明所有变量

      这就像一部戏剧中所有演员的介绍。

      function transformEmployeeData(employeeData) {
        var obj,
            arr = [],
            i, j,
            key, value;
      
        for (i = 0; i < employeeData.length; i ++) {
          obj = {}
          for (j = 0; j < employeeData[i].length; j ++) {
            key = employeeData[i][j][0];
            value = employeeData[i][j][1];
            obj[key] = value;
          }
          arr.push(obj);
        }
        return arr;
      }
      
      var array = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],[['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]];
      
      console.log(transformEmployeeData(array));
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      对于一个简短的解决方案,您可以使用一些 ES5/ES6 功能:

      function transformEmployeeData(array) {
          return array.map(person => Object.assign(...person.map(([k, v]) => ({ [k]: v }))));
      }
      
      var array = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],[['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]];
      
      console.log(transformEmployeeData(array));
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

      • 这很有效,真的帮助我开始了解一些新功能......真的很棒的评论和感谢!
      【解决方案3】:

      您可以使用map 迭代主数组中的subarrays,然后使用reduce 将其子数组转换为对象属性。

      var arr = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']], [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]];
      
      var result = arr.map(function(subArr){
          return subArr.reduce(function(acc, data){
              acc[data[0]] = data[1];
              return acc;
          },{})
      });
      
      console.log(result);

      【讨论】:

        【解决方案4】:

        Array.prototype.map()Array.prototype.reduce() 与一些array destructuring 一起使用:

        const result = data.map(entry => entry.reduce((a, [k, v]) => (a[k] = v, a), {}));
        

        演示 sn-p:

        const data = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
        [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]];
        
        const result = data.map(entry => entry.reduce((a, [k, v]) => (a[k] = v, a), {}));
        
        console.log(result);

        【讨论】:

        • 更简洁!谢谢
        【解决方案5】:

        只要将Array#mapArray#reduce结合使用就很简单了。

        let data = [
          [
            ['firstName', 'Joe'],
            ['lastName', 'Blow'],
            ['age', 42],
            ['role', 'clerk']
          ],
          [
            ['firstName', 'Mary'],
            ['lastName', 'Jenkins'],
            ['age', 36],
            ['role', 'manager']
          ]
        ];
        
        let result = data.map(item => item.reduce((acc, [key, val]) => ({ ...acc, [key]: val }), {}));
        console.log(result);

        【讨论】:

          【解决方案6】:

          非常接近,您只需将obj = {} 放入外部for循环

          function transformEmployeeData(employeeData) { 
             var arr = []
             for (var i = 0; i < employeeData.length; i ++) {
                var obj = {}; //observe this line
                for (var j = 0; j < employeeData[i].length; j ++) {
                   var key = employeeData[i][j][0];
                   var value = employeeData[i][j][1];
                   obj[key] = value;
                }
                arr.push(obj);
             }
             return arr;
          }
          

          演示

          var arr = [
            [
              ['firstName', 'Joe'],
              ['lastName', 'Blow'],
              ['age', 42],
              ['role', 'clerk']
            ],
            [
              ['firstName', 'Mary'],
              ['lastName', 'Jenkins'],
              ['age', 36],
              ['role', 'manager']
            ]
          ];
          
          function transformEmployeeData(employeeData) {
            var arr = []
            for (var i = 0; i < employeeData.length; i++) {
              var obj = {};
              for (var j = 0; j < employeeData[i].length; j++) {
                var key = employeeData[i][j][0];
                var value = employeeData[i][j][1];
                obj[key] = value;
              }
              arr.push(obj);
            }
            return arr;
          }
          
          console.log( transformEmployeeData(arr) );

          【讨论】:

            【解决方案7】:

            你可以使用Object.fromEnteries()ECMAScript 2019 (ES10)

            var arr = [
              [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
              [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
            ];
            
            const object = arr.map(item => Object.fromEntries(item));
            
            console.log(object);

            【讨论】:

              猜你喜欢
              • 2018-01-24
              • 2016-04-13
              • 1970-01-01
              • 2022-12-18
              • 1970-01-01
              • 2017-05-16
              • 2019-10-12
              • 1970-01-01
              • 2020-07-07
              相关资源
              最近更新 更多