lodash:组合对象数组

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中使用实用程序功能.

Gru*_*nny 6

您可以使用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)