我正在处理一个函数:
function transformEmployeeData(array) {
return array.map(function(data) {
return data.reduce(function(a, b) {
a[b[0]] = b[1];
return a;
}, {})
});
}
transformEmployeeData(array);
此函数将数组转换为如下对象:
[
{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 array.map(function(data) {
return data.reduce(function(a, b) {
a[b[0]] = b[1];
return a;
}, {})
});
我研究了map函数,它迭代数组并用它做一些事情,而reduce函数将数组压缩成一个值。现在我不清楚这两个函数如何协同工作返回转换后的数组对象。是否有人可以帮助我理解这些部分的外行术语?或者如果没有最简单的方法来实现同样的目标吗?
SOrry新手。
答案 0 :(得分:2)
从这个意义上说,映射数组意味着返回一个新数组,每个值都是根据某些映射函数转换的。
const numbers = [1, 2, 3];
const squares = numbers.map(num => num ** 2);
console.log(squares);
如您所说,减少数组意味着将其元素组合成单个值。
const numbers = [1, 2, 3];
const sum = numbers.reduce((total, num) => total + num, 0);
console.log(sum);
在这种情况下,您有3个级别的嵌套数组,该过程可分为3个功能单元。了解正在发生的事情的最简单方法是从最内部点开始,然后向外转到顶层数组的映射。
在最内层,[property, value]
形式的2个元素的数组被添加到对象中,使得第一个元素是属性名称,第二个元素是值。
const arr = ['name', 'bob'];
// property is item[0], value is item[1]
const propertyName = arr[0];
const propertyValue = arr[1];
const obj = {};
obj[propertyName] = propertyValue;
console.log(obj); // { name: 'bob' }
在中间层,我们有一个数组,其中每个元素都是上面提到的2元素数组。通过将每个2元素数组转换为对象的属性和值,该数组数组被缩减为对象。
const arr = [
['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']
];
const reduced = arr.reduce((obj, item) => {
obj[item[0]] = item[1]; // add property and value to new object
return obj; // return the object so next array item can be converted
}, {});
console.log(reduced);
最后,顶级映射只是将上面提到的2元素数组数组(3个数组级别)的数组转换为一个对象数组,这些对象获得了前面提到的属性和值。