kno*_*eur 2 javascript arrays loops nested-loops multidimensional-array
我想将一组嵌套数组转换为一个对象数组,其中包含来自嵌套数组的收集信息:
之前:
var employeeData = [
[
['firstName', 'Bob'], ['lastName', 'Lob'], ['age', 22], ['role', 'salesperson']
],
[
['firstName', 'Mary'], ['lastName', 'Joe'], ['age', 32], ['role', 'director']
]
]
Run Code Online (Sandbox Code Playgroud)
后:
[
{firstName: 'Bob', lastName: 'Lob', age: 22, role: 'salesperson'},
{firstName: 'Mary', lastName: 'Joe', age: 32, role: 'director'}
]
Run Code Online (Sandbox Code Playgroud)
这是我写的解决这个问题的函数,但是我无法看到循环出错的地方:
var employeeData = [
[
['firstName', 'Bob'], ['lastName', 'Lob'], ['age', 22], ['role', 'salesperson']
],
[
['firstName', 'Mary'], ['lastName', 'Joe'], ['age', 32], ['role', 'director']
]
]
function transformData(employeeData) {
let newObject = {};
let newArr = [];
for (var i = 0; i < employeeData.length; i++) {
for (var x = 0; x < employeeData[i].length; x++) {
for (var y = 0; y < employeeData[i][y].length; y++) {
newObject[employeeData[i][y][0]] = employeeData[i][y][1];
}
}
newArr.push(newObject);
newObject = {};
}
return newArr;
}
console.log(transformData(employeeData));Run Code Online (Sandbox Code Playgroud)
提前致谢.
您的代码有什么问题:
第三级for循环搞砸了.它应该删除:
for (var y = 0; y < employeeData[i][x].length; y++) {
// ^ by the way this should be x not y (not fixing the problem though)
Run Code Online (Sandbox Code Playgroud)
因为第三级数组包含您需要同时使用的2个元素(作为键值),所以for应该删除它们的循环.
固定:
for (var i = 0; i < employeeData.length; i++) {
for (var x = 0; x < employeeData[i].length; x++) {
newObject[employeeData[i][x][0]] = employeeData[i][x][1];
}
newArr.push(newObject);
newObject = {};
}
Run Code Online (Sandbox Code Playgroud)
修复代码示例:
var employeeData = [
[
['firstName', 'Bob'], ['lastName', 'Lob'], ['age', 22], ['role', 'salesperson']
],
[
['firstName', 'Mary'], ['lastName', 'Joe'], ['age', 32], ['role', 'director']
]
]
function transformData(employeeData) {
let newObject = {};
let newArr = [];
for (var i = 0; i < employeeData.length; i++) {
for (var x = 0; x < employeeData[i].length; x++) {
newObject[employeeData[i][x][0]] = employeeData[i][x][1];
}
newArr.push(newObject);
newObject = {};
}
return newArr;
}
console.log(transformData(employeeData));Run Code Online (Sandbox Code Playgroud)
替代方案:
您可以将map employeeData数组放入一个新数组中,将reduce每个子数组放入一个对象中,如下所示:
var result = employeeData.map(function(sub) {
return sub.reduce(function(obj, pair) {
obj[ pair[0] ] = pair[1];
return obj;
}, {});
});
Run Code Online (Sandbox Code Playgroud)
使用ES6的箭头功能可以缩短以下内容:
let result = employeeData.map(sub => sub.reduce((obj, pair) => (obj[pair[0]] = pair[1], obj), {}));
Run Code Online (Sandbox Code Playgroud)
例:
let employeeData = [
[
['firstName', 'Bob'], ['lastName', 'Lob'], ['age', 22], ['role', 'salesperson']
],
[
['firstName', 'Mary'], ['lastName', 'Joe'], ['age', 32], ['role', 'director']
]
];
let result = employeeData.map(sub => sub.reduce((obj, pair) => (obj[pair[0]] = pair[1], obj), {}));
console.log(result);Run Code Online (Sandbox Code Playgroud)
如何修复您的代码
您只需要2个for循环:1.迭代数组2.迭代子数组并构造对象
var employeeData = [[["firstName","Bob"],["lastName","Lob"],["age",22],["role","salesperson"]],[["firstName","Mary"],["lastName","Joe"],["age",32],["role","director"]]]
function transformData(employeeData) {
let newObject;
const newArr = [];
for (var i = 0; i < employeeData.length; i++) {
newObject = {}; // init new object
for (var x = 0; x < employeeData[i].length; x++) {
newObject[employeeData[i][x][0]] = employeeData[i][x][1]; // iterate inner arrays and assign properties to object
}
newArr.push(newObject);
}
return newArr;
}
console.log(transformData(employeeData));Run Code Online (Sandbox Code Playgroud)
另一种选择是使用Array#map组合来迭代外部数组,并使用Array#reduce从内部数组构造对象:
const employeeData = [[["firstName","Bob"],["lastName","Lob"],["age",22],["role","salesperson"]],[["firstName","Mary"],["lastName","Joe"],["age",32],["role","director"]]]
const result = employeeData.map((arr) =>
arr.reduce((o, [key, value]) => (o[key] = value, o), {})
);
console.log(result);Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3109 次 |
| 最近记录: |