[英]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.