我正在进行一项涉及将数组转换为对象的任务,而且我有点紧张。我们从一个数组开始,包含两个额外的嵌套数组,每个数组包含可变数量的数组(每个数组包含两个值)。
赋值是将所有这些转换为一个包含多个对象的数组。在每个对象中,将存在一系列键/值对,其等于来自每个最小给定阵列的两个值。
EG
参数将如下所示:
[
[['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'}]
使用调试器,我已经确定我的代码正确地将键/值对分配给return语句中的第一个对象。但是,当循环继续时,不是创建新的嵌套对象,而是替换第一个对象的键/值对,因此我最终只得到一个对象,该对象具有来自所评估的最终数组的正确键值对。
到目前为止,这是我的代码:
function transformEmployeeData(employeeData) {
var obj = {}, arr = []
for (var i = 0; i < employeeData.length; i ++) {
for (var j = 0; j < employeeData[i].length; j ++) {
var key = employeeData[i][j][0];
var value = employeeData[i][j][1];
obj[key] = value;
}
arr.push(obj);
}
return arr;
}
这个让我的大脑有点结了......任何建议都会非常感激!!!
除了在第一个循环内移动新对象的赋值之外,您还可以考虑在函数顶部声明所有变量。
这就像是戏剧中所有演员的介绍。
function transformEmployeeData(employeeData) {
var obj,
arr = [],
i, j,
key, value;
for (i = 0; i < employeeData.length; i ++) {
obj = {}
for (j = 0; j < employeeData[i].length; j ++) {
key = employeeData[i][j][0];
value = employeeData[i][j][1];
obj[key] = value;
}
arr.push(obj);
}
return arr;
}
var array = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],[['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]];
console.log(transformEmployeeData(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }
对于简短的解决方案,您可以使用一些ES5 / ES6功能:
Array#map
以数组作为参数,非常接近,你只需要将destructuring assignment放在外部for循环中
computed property names
演示
function transformEmployeeData(array) {
return array.map(person => Object.assign(...person.map(([k, v]) => ({ [k]: v }))));
}
var array = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],[['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]];
console.log(transformEmployeeData(array));
如果你只是将qazxsw poi与qazxsw poi结合使用,这很简单。
.as-console-wrapper { max-height: 100% !important; top: 0; }
您可以使用obj = {}
迭代主数组中的function transformEmployeeData(employeeData) {
var arr = []
for (var i = 0; i < employeeData.length; i ++) {
var obj = {}; //observe this line
for (var j = 0; j < employeeData[i].length; j ++) {
var key = employeeData[i][j][0];
var value = employeeData[i][j][1];
obj[key] = value;
}
arr.push(obj);
}
return arr;
}
,然后使用var arr = [
[
['firstName', 'Joe'],
['lastName', 'Blow'],
['age', 42],
['role', 'clerk']
],
[
['firstName', 'Mary'],
['lastName', 'Jenkins'],
['age', 36],
['role', 'manager']
]
];
function transformEmployeeData(employeeData) {
var arr = []
for (var i = 0; i < employeeData.length; i++) {
var obj = {};
for (var j = 0; j < employeeData[i].length; j++) {
var key = employeeData[i][j][0];
var value = employeeData[i][j][1];
obj[key] = value;
}
arr.push(obj);
}
return arr;
}
console.log( transformEmployeeData(arr) );
将其子数组转换为对象属性。
使用Array#reduce
和let data = [
[
['firstName', 'Joe'],
['lastName', 'Blow'],
['age', 42],
['role', 'clerk']
],
[
['firstName', 'Mary'],
['lastName', 'Jenkins'],
['age', 36],
['role', 'manager']
]
];
let result = data.map(item => {
return item.reduce((acc, item) => {
acc[item[0]] = item[1];
return acc;
}, {});
});
console.log(result);
与一些map
:
subarrays
演示片段:
reduce
该问题的更新和一行解决方案:
var arr = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']], [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]];
var result = arr.map(function(subArr){
return subArr.reduce(function(acc, data){
acc[data[0]] = data[1];
return acc;
},{})
});
console.log(result);
Array.prototype.map()
已在ECMAScript 2019(ES10)中引入
在撰写本文时(2019年4月11日),这种方法已经由Chrome 73和Firefox 63实现。很快它将由主要浏览器的新版本实现。自7.4.0版本(core-js @ 3)以来,BabelJs中也提供了该方法。