簡體   English   中英

Arrays 數組到對象數組 JS

[英]Array of Arrays to Array of Objects JS

這個特殊的挑戰要求我將 arrays 數組(有這個術語嗎?)轉換為對象數組,如下所示:

[[['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'}]

到目前為止,這是我的代碼:

function transformEmployeeData(array) {
var object={};
for (var i = 0; i < array.length;i++){
    var newArray = array[i];
    object[i] = newArray[1];
    object[newArray[0]] = object[i];
    newArray.push(object);
    delete object[i];
    }
return object;
}

var myArray= [['firstName','Joe'],['lastName','Blow'],['age', 42], ['role','clerk']];
transformEmployeeData(myArray); 

它似乎工作得很好,直到我添加另一個嵌套數組和第二個(或第三個或第四個,這是事情的重點)員工數據。

我確定它與循環有關,但我無法發現它。

幫助表示贊賞!

您需要在循環創建一個新對象,以便每次都創建一個新對象,而不僅僅是重新分配同一對象的屬性-您多次將同一對象推入數組。 (我不確定為什么要使用delete -不需要它。)

所以像這樣:

 function transformEmployeeData(data) { var result = [] // new array to hold transformed data var key, value for (var i = 0; i < data.length; i++) { // loop over employees var employee = {} // new object for current employee for (var j = 0; j < data[i].length; j++) { // loop over current employee details key = data[i][j][0] // extract property key name value = data[i][j][1] // and value employee[key] = value // add property to object } result.push(employee) // add new object to array } return result } var input = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']], [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]] console.log( transformEmployeeData(input) ) 

或者,如果您想使用一些數組函數,例如.map().reduce() ,則可以“簡化”代碼:

 function transformEmployeeData(data) { return data.map(function(employee) { return employee.reduce(function(a, c) { a[c[0]] = c[1] return a }, {}) }) } var input = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']], [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]] console.log( transformEmployeeData(input) ) 

這是使用Array.prototype.map()Array.prototype.reduce()的解決方案:

 let arrayOfArrays = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']], [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]]; let arrayOfObjects = arrayOfArrays.map(array => array.reduce((acc, val) => { acc[val[0]] = val[1]; return acc; }, {})); console.log(arrayOfObjects); 

這是我使用forEach Array對象方法的解決方案

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

    transformEmployeeData(array);

    function transformEmployeeData(array){
      var employees = [];
      array.forEach(function(employee,index){
        var employeeObj = {};
        employee.forEach(function(data,key){
          employeeObj[data[0]] = data[1];
        });
        employees.push(employeeObj);
      });
      return employees;
    }

與 Object.fromEntries,一個班輪

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM