【问题标题】:How to convert nested array pairs to objects in an array如何将嵌套数组对转换为数组中的对象
【发布时间】:2017-03-25 09:07:46
【问题描述】:

我的任务是将以下数组转换为对象对数组:

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

我需要将arr 转换为如下所示的对象数组:

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

【问题讨论】:

  • 请把你付出的努力和你想要的输出
  • 输出格式是什么?
  • 你想要这样 - var arr = [{'firstName':'Joe','lastName':'Blow','age':42,'role':'clert'},{ 'firstName':'Mary','lastName':'Jenkins','age':36,'role':'manager'}]
  • 提及您尝试过的内容,所需的输出是什么。此外,格式化问题,添加代码块。 arr 缺少一个 ']'

标签: javascript arrays object


【解决方案1】:

程序化解决方案(也可在https://jsfiddle.net/edorka/jnLxyzhb/ 获得):

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

var empty = {};
var result = arr.map(function(objectArray){
    var object = this;
    var attribute = objectArray.map(function(attrArray){
        var name = attrArray[0], value = attrArray[1];
        object[name] = value;
        return object;
    }, object);
    return this;
}, empty);

console.log(result);

【讨论】:

    【解决方案2】:

    你可以这样转换 -

    var arr = [
                {'firstName':'Joe','lastName':'Blow','age':42,'role':'clert‌​'},
                {'firstName':'Mar‌​y','lastName':'Jenki‌​ns','age':36,'role':‌​'manager'}
              ]
    

    【讨论】:

    • 这和他们发布的有什么区别?这如何帮助他们实现这一目标?这似乎是对他们所说的他们想要的东西的重申,加上一些引号
    【解决方案3】:

    对象数组示例

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

    【讨论】:

      【解决方案4】:

      您可以对嵌套数组使用迭代和递归方法。

      var array = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk'], [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]]],
          result = [];
      
      array[0].forEach(function iter(a, i) {
          i || result.push({});
          if (i < 4) {
              result[result.length - 1][a[0]] = a[1];
              return;
          }
          Array.isArray(a) && a.forEach(iter);
      });
         
      console.log(result);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

      • 不知道嵌入式sn-ps,感谢您的回复。但是恕我直言,我看到您的解决方案受到属性数量(四个)的限制,但这缺乏弹性,我的意思是,如果 i == 2 那么它是一个名称/值元组。
      • 我使用了我拥有的数据,看起来前四个元素应该是对象的一部分。
      • 这就是我能想到的
      • 它确实有效,但我认为这不是最有效的解决方案。
      • 如果您提供的数据多于上述数据,我可以优化提案。
      【解决方案5】:
      function convert(array) {
        return array.map(function(person) {
          return person.reduce(function(obj, prop, index) {
            if (!obj[prop[0]]) {
              obj[prop[0]] = prop[1];
            }
      
            return obj;
          }, {});
        }); 
      }
      
      • 使用地图功能选择每个“人”数组
      • 使用 reduce 函数将每个“人”数组转换为对象
      • map 函数还将返回一个新的对象数组
      • 原始数组不会改变

      【讨论】:

        【解决方案6】:

        如果您格式化您的代码,您首先会看到末尾缺少 1 个右大括号 ']'。而你的结构是这样的

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

        我想你想做这样的事情

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

        但我会建议你这样做

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

        【讨论】:

        • 请放弃反对票的评论。所以我可以找到我错的地方
        猜你喜欢
        • 2020-07-03
        • 2017-11-15
        • 1970-01-01
        • 2021-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多