【问题标题】:Flatten and merge array of array of objects in Javascript在Javascript中展平和合并对象数组的数组
【发布时间】:2017-07-05 09:24:00
【问题描述】:

这是我的输入:

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 个元素并将其合并为一个对象,并将其推送到一个结果数组中。

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

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)的解决方案。

你们知道吗?

【问题讨论】:

    标签: javascript arrays merge reduce


    【解决方案1】:

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

    【讨论】:

    • 尼娜真快。
    • 是的,她很快就有了解决方案,并对其进行了改进。谢谢妮娜!
    猜你喜欢
    • 2018-02-24
    • 2015-05-23
    • 2023-01-11
    • 1970-01-01
    • 2020-07-19
    • 2022-01-25
    • 2023-03-20
    相关资源
    最近更新 更多