jgr*_*gr0 5 javascript arrays functional-programming lodash
在lodash中,我想将一个对象数组转换为一个包含每个属性数组的对象.
我有一个对象数组:
var students = [{
name: 'A',
idNo: 1,
marks: {
math: 98,
sci: 97,
eng: 89
}
}, {
name: 'B',
idNo: 2,
marks: {
math: 88,
sci: 87,
eng: 79
}
}, {
name: 'C',
idNo: 3,
marks: {
math: 87,
sci: 98,
eng: 91
}
}]
Run Code Online (Sandbox Code Playgroud)
我想像这样组合/重塑它们:
{
name: [A, B, C],
idNo: [1, 2, 3],
marks: [{
math: 98,
sci: 97,
eng: 89
}, {
math: 88,
sci: 87,
eng: 79
}, {
math: 87,
sci: 98,
eng: 91
}
}]
}
Run Code Online (Sandbox Code Playgroud)
我希望这完全是用lodash或js内置函数完成的,没有任何循环.
编辑:我已经按照Nenad的建议实施了一个解决方案.我想在lodash中使用实用程序功能.
您可以使用lodash的mapValues函数:
var result = _.mapValues(students[0], (value, key) => _.map(students, key));
Run Code Online (Sandbox Code Playgroud)
mapValues创建一个具有与作为第一个参数传递给它的对象相同的键的对象。在这里,我们传递了students数组中的第一个对象,students[0]因此by返回的对象mapValues将如下所示:
{
name: ....,
idNo: ....,
marks: ....
}
Run Code Online (Sandbox Code Playgroud)
每个键的值由mapValues作为第二个参数传递给的函数确定。mapValues将为每个键调用此函数并传递值和键。我们对值不感兴趣,但是该键用于为该键提取student数组中的所有值(通过使用key作为第二个参数调用map)。
var result = _.mapValues(students[0], (value, key) => _.map(students, key));
Run Code Online (Sandbox Code Playgroud)
{
name: ....,
idNo: ....,
marks: ....
}
Run Code Online (Sandbox Code Playgroud)