javascript - 在 Javascript 中展平和合并对象数组

标签 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 个元素并将其合并到一个对象中,并将其插入结果数组。

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

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 等函数式方法的解决方案。

你们知道吗?

最佳答案

你可以使用 Array#reduce , Array#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; }

关于javascript - 在 Javascript 中展平和合并对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42271026/

相关文章:

javascript - 我如何在 JavaScript 中四舍五入一个数字?

android - 如何使用 GSON 创建 JSONArray

c - 具有未定义长度但只有一个 int 元素的数组的目的是什么?

python - 将 DataFrames 与 Pks 的所有组合合并

git - 将相同的文件重命名更改应用于不同的 GIT 分支

git - 将两个独立的 SVN 存储库 merge 为一个 Git 存储库

javascript - 如何通过坐标计算 HTML Canvas 中的变换

c# - 将 C# 正则表达式转换为 javascript

javascript - 在类方法 Javascript 中引用类变量

java - 如何合并数组并保留中继器