在Javascript

时间:2017-02-16 10:20:12

标签: javascript arrays merge reduce

以下是我的意见:

var toto=[
    [
        { "a": "24" },
        { "a": "23.9"},
        { "a": "NaN"},
        { "a": "3" }
    ],
    [
        {"b": "19"},
        {"b": "20"},
        {"b": "NaN"},
        {"b": "3" }
    ],
    [
        {"c": "27"},
        {"c": "28"},
        {"c": "NaN"},
        {"c": "3" }
    ]
];

保证所有对象数组包含相同数量的对象。

我想在输出中获得:

var out =  [
        { "a": "24", "b": "19", "c":"27" },
        { "a": "23.9", "b": "20", "c":"28"},
        { "a": "NaN", "b": "NaN", "c":"NaN"},
        { "a": "3", "b": "3", "c": "3"}
    ]

对于每个内部数组,取第N个元素并将其合并到一个对象中,然后将其推入结果数组中。

我有一个“braindead”解决方案,它在第一个子数组上迭代,然后在其他数组上进行迭代:

var out = [];
$(toto[0]).each(function(i, item) {
   var o = {};
   $(toto).each(function( j, array) {
    var item = array[i];
    o[Object.keys(item)[0]] = Object.values(item)[0];
   });
   out.push(o);
});

它有效,但它有点可怕,我想知道是否有使用map和reduce等功能方法的解决方案。

你知道吗?

1 个答案:

答案 0 :(得分:6)

您可以使用Array#reduceArray#forEachObject.assign作为内部数组具有相同索引的数据的数据透视。



var toto=[[{ a: "24" }, { a: "23.9" }, { a: "NaN" }, { a: "3" }], [{ b: "19" }, { b: "20" }, { b: "NaN" }, { b: "3" }], [{ c: "27" }, { c: "28" }, { c: "NaN" }, { c: "3" }]],
    result = toto.reduce(function (r, a) {
        a.forEach(function (b, i) {
            r[i] = r[i] || {};
            Object.assign(r[i], b);
        });
        return r;
    }, []);

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }