Ale*_*lex 5 javascript arrays nested object
我正在处理一项涉及将数组转换为对象的作业,但我有点束手无策。我们从一个数组开始,其中包含两个额外的嵌套数组,每个数组包含可变数量的数组(每个数组包含两个值)。
任务是将所有这些转换为一个包含多个对象的数组。在每个对象中,将有一系列键/值对,它们等于每个最小给定数组中的两个值。
例如
参数将如下所示:
[
[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
[['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
]
Run Code Online (Sandbox Code Playgroud)
鉴于该输入,返回值应如下所示:
[{firstName: 'Joe', lastName: 'Blow', age: 42, role: 'clerk'}, {firstName: 'Mary', lastName: 'Jenkins', age: 36, role: 'manager'}]
Run Code Online (Sandbox Code Playgroud)
使用调试器,我确定我的代码正确地将键/值对分配给 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;
}
Run Code Online (Sandbox Code Playgroud)
这个让我的大脑有点打结......任何建议将不胜感激!!!
该问题的更新和单行解决方案:
const input = [
[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
[['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
]
const output = input.map(a => Object.fromEntries(a));
console.log(output);Run Code Online (Sandbox Code Playgroud)
Object.fromEntries() 已在 ECMAScript 2019 (ES10) 中引入
在撰写本文时(2019 年 4 月 11 日),此方法已被 Chrome 73 和 Firefox 63 实现。很快它将被主要浏览器的新版本实现。从 7.4.0 (core-js@3) 版本开始,该方法也可以在 BabelJs 中使用。
除了在第一个循环内移动新对象的赋值之外,您还可以考虑在函数顶部声明所有变量。
这就像一部戏剧中所有演员的介绍。
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));Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }Run Code Online (Sandbox Code Playgroud)
对于简短的解决方案,您可以使用一些 ES5/ES6 特性:
Array#map 为每个元素重新调整一个新对象
Object.assign 为对象分配更多属性,
解构赋值,就像变压器和
计算属性名称,一些 JavaScript 的伟大思想。(我希望它也适用于变量。)
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));Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }Run Code Online (Sandbox Code Playgroud)