如何将嵌套数组对转换为数组中的对象

Posted

技术标签:

【中文标题】如何将嵌套数组对转换为数组中的对象【英文标题】: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 缺少一个 ']' 【参考方案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'
    
];

【讨论】:

请放弃反对票的评论。所以我可以找到我错的地方

以上是关于如何将嵌套数组对转换为数组中的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何将嵌套的 JSON 对象转换为数组 Spring Boot?

将嵌套对象中的单值数组转换为单值javascript

如何根据 Aurelia/Typescript 中的嵌套属性对对象数组进行排序

SQL(雅典娜)中的取消嵌套:如何将结构数组转换为从结构中提取的值数组?

如何将嵌套对象转换为数组数组

如何在 Ios 中解析数组数据中的嵌套 Json 对象