1

次のようなオブジェクトの配列があるとします。

[
    { x: 'x1', y: 'y1' },
    { y: 'y2', z: 'z1' },
    { z: 'z2', x: 'x2' } 
]

私はこのようなオブジェクトを生成したい:

{
    x: [ 'x1', 'x2' ],
    y: [ 'y1', 'y2' ],
    z: [ 'z1', 'z2' ] 
}

ES5 または map/reduce/etc のような underscore.js 関数を使用して、JavaScript で関数型プログラミング スタイルのソリューションを探しています。

4

3 に答える 3

3

以下のようなものでしょうか。

var array = [ { x: 'x1', y: 'y1' },
              { y: 'y2', z: 'z1' },
              { z: 'z2', x: 'x2' }
            ];

var result = array.reduce(function(res, obj) {
    Object.keys(obj).map(function(k) {
        if (!res[k])
            res[k] = [];
        res[k].push(obj[k]);
    });
    return res;
}, {});

ほとんどの人は、これがループ方法よりもはるかに混乱していると思うことに注意してください。

var result = {};
for (var i = 0; i < array.length; i++) {
    for (var k in array[i]) {
        if (!result[k])
            result[k] = [];
        result[k].push(array[i][k]);
    }
}
于 2013-08-14T17:14:59.957 に答える
0

groupByプロパティ名を完全に無視し、値の最初の文字を使用する、アンダースコアを使用したかなり型破りなアプローチ:

var arr = [
    { x: 'x1', y: 'y1' },
    { y: 'y2', z: 'z1' },
    { z: 'z2', x: 'x2' }
];
return _.groupBy( _.flatten(_.map(arr, _.values)), 0);

完全に機能的なアプローチはreduce、グループ化を行うために使用されます。

return _.reduce( arr, function(m, obj) {
    return _.reduce( obj, function(m, val, key) {
        (m[key] || (m[key] = [])).push(val);
        return m;
    }, m);
}, {});
于 2013-08-14T19:11:49.850 に答える