【问题标题】:Is there a way to solve this problem by using .forEach or .map instead of for-loop?有没有办法通过使用 .forEach 或 .map 而不是 for-loop 来解决这个问题?
【发布时间】:2019-04-03 15:15:36
【问题描述】:

我需要编写一个函数,将数组中的数组元素转换为对象。虽然我已经找到了使用for-loop 来解决问题的方法,但我只是想知道是否有更简洁的方法可以使用forEachmap 等方法来编写解决方案强>。

问题是……

var array: [
  [
    ['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' }
];

以下是我使用for-loop 编写的代码。

function transformEmployeeData(array)
{  
  var output = [];

  for (var i = 0; i < array.length; i++)
  {
    var obj = {};

    for (var j = 0; j < array[i].length; j++)
    {
      obj[array[i][j][0]] = array[i][j][1];
    }

    output.push(obj);
  }

  return output;
}

就像我上面提到的那样,如果有其他方法可以解决问题,那就太好了。

【问题讨论】:

  • 如果这种方式适合您,我认为没有任何理由采用另一种方式。如果有的话,您现在的代码比使用 .map().forEach() 时更具可读性。您是否有理由想以另一种方式进行操作?
  • 每当您创建一个空数组,并迭代某些内容并将其添加到数组中时,您可能应该使用 Array#map,但如果您的代码有效,那么它不适合这个论坛。也许codereview.stackexchange.com 另一个建议,创建一个函数,将数组的每一行转换为一个对象。
  • 刚开始学习编程,最近学习了数组相关的方法。我只是想应用我学到的东西,但经过几个小时的尝试后效果并不好。我以后会避免这种问题。谢谢你们的cmets!
  • 这里有足够的答案...我会使用 map reducer,因为您可能需要减少,如果数组在单独的索引中具有相同的键会发生什么,减少对我来说听起来是正确的

标签: javascript arrays object


【解决方案1】:

在不久的将来,也许您可​​以使用Object.fromEntries()。目前部分浏览器版本支持:Browser Compatibility:

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

console.log(arr.map(Object.fromEntries));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

【讨论】:

    【解决方案2】:

    您可以通过映射属性来映射新对象并​​将所有属性连接到单个对象。

    var data = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']], [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]],
        result = data.map(a => Object.assign(...a.map(([key, value]) => ({ [key]: value }))));
        
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      使用 map 和 reduce。

        var array = [
        [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
        [
          ['firstName', 'Mary'],
          ['lastName', 'Jenkins'],
          ['age', 36],
          ['role', 'manager']
        ]
          ];
      
          var transformed = array.map(a=> a.reduce((c, p) => {c[p[0]] = p[1]; return c;},{}));
          console.log(transformed);

      【讨论】:

        【解决方案4】:

        要达到预期的效果,请使用以下使用 map 和 forEach 的选项

        var array = [
          [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
          [
            ['firstName', 'Mary'],
            ['lastName', 'Jenkins'],
            ['age', 36],
            ['role', 'manager']
          ]
            ];
        
        console.log(array.map(val => {
          const result = {}
          val.forEach(v => {
            result[v[0]] = v[1]
          })
          return result
        }))

        codepen - https://codepen.io/nagasai/pen/ROWmEX

        【讨论】:

          【解决方案5】:

          是的,你可以一行完成。

          var array = [
            [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
            [
              ['firstName', 'Mary'],
              ['lastName', 'Jenkins'],
              ['age', 36],
              ['role', 'manager']
            ]
              ];
          
          const transformed = array.map(upperArr => upperArr.reduce((acc, itemArr) => { acc[itemArr[0]] = itemArr[1]; return acc;}, {}));
          console.log(transformed);

          【讨论】:

            【解决方案6】:

            您可以串联使用mapreduce(将每个元素映射到reduce 函数的结果,reduce 函数将每个元素转换为键/值对):

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

            【讨论】:

              【解决方案7】:

              使用 map 和 forEach 的函数:

              function transformEmployeeData(array) {  
                return array.map(toObject => {
                  const obj = {};
                  toObject.forEach(([key, value]) => {
                    obj[key] = value;
                  });
                  return obj;
                });
              };
              

              var array = [
                [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
                [
                  ['firstName', 'Mary'],
                  ['lastName', 'Jenkins'],
                  ['age', 36],
                  ['role', 'manager']
                ]
              ];
                  
              function transformEmployeeData(array) {  
                return array.map(toObject => {
                  const obj = {};
                  toObject.forEach(([key, value]) => {
                    obj[key] = value;
                  });
                  return obj;
                });
              };
              
              console.log(transformEmployeeData(array));

              【讨论】:

                猜你喜欢
                • 2019-04-07
                • 2022-09-27
                • 2012-01-15
                • 1970-01-01
                • 1970-01-01
                • 2020-02-09
                • 1970-01-01
                • 1970-01-01
                • 2020-02-25
                相关资源
                最近更新 更多