javascript - 如何在数组中使用reduce方法将具有公共(public)键的多个Json对象转换为单个Json对象?

标签 javascript arrays json

我在 NodeJS 中有一个函数,它返回 Json Javascript 对象。

let rows = function1();

这里的行看起来像:

"rows": [
    {
    "Hostname": "abc123",
    "name": "name1",
    "Status": "PASS",
    "Heading": "Not Applicable"
    },
    {
    "Hostname": "abc123",
    "name": "name2",
    "Status": "FAIL",
    "Heading": "Not Applicable"
    },
    {
    "Hostname": "abc235",
    "name": "name1",
    "Status": "FAIL",
    "Heading": "Not Applicable"
    },
    {
    "Hostname": "abc235",
    "name": "name2",
    "Status": "FAIL",
    "Heading": "Not Applicable"
    }
]

这里,rows 对于同一个 Hostname 键可以有任意数量的 Json 对象:

"rows": [
    {
    "Hostname": "abc123",
    "name": "name1",
    "Status": "PASS",
    "Heading": "Not Applicable"
    },
    {
    "Hostname": "abc123",
    "name": "name2",
    "Status": "FAIL",
    "Heading": "Not Applicable"
    },
    {
    "Hostname": "abc123",
    "name": "name3",
    "Status": "FAIL",
    "Heading": "Not Applicable"
    },
 ...
    {
    "Hostname": "abc235",
    "name": "name1",
    "Status": "FAIL",
    "Heading": "Not Applicable"
    },
    {
    "Hostname": "abc235",
    "name": "name2",
    "Status": "FAIL",
    "Heading": "Not Applicable"
    },
    {
    "Hostname": "abc235",
    "name": "name3",
    "Status": "FAIL",
    "Heading": "Not Applicable"
    }
...
]

我想修改 rows 数组,以便将属于一个 Hostname 的所有 Javascript 对象转换为单个 Json 对象:

"rows": [
    {
    "Hostname": "abc123",
    "name1Status": "PASS",
    "name1Heading": "Not Applicable"
    "name2Status": "FAIL",
    "name2Heading": "Not Applicable"
    "name3Status": "FAIL",
    "name3Heading": "Not Applicable"
    ...
    },
    {
    "Hostname": "abc235",
    "name1Status": "FAIL",
    "name1Heading": "Not Applicable"
    "name2Status": "FAIL",
    "name2Heading": "Not Applicable"
    "name3Status": "FAIL",
    "name3Heading": "Not Applicable"
    ...
    }
]

我编写了以下代码,但它会覆盖所有键值对并仅显示与最后一个 Hostname 相关的 Json 对象

const res = rows.reduce((acc, rec) => {
    let result = { ...acc, [`Hostname`]: rec.Hostname,  [`${rec.name}Status`]: rec.Status, [`${rec.name}Heading`]: rec.Heading  }
    return result
}, [])

{
    "Hostname": "abc235",
    "name1Status": "FAIL",
    "name1Heading": "Not Applicable"
    "name2Status": "FAIL",
    "name2Heading": "Not Applicable"
    "name3Status": "FAIL",
    "name3Heading": "Not Applicable"
}

res 之外可能存在某种形式的 for 循环,以便它考虑所有不同的 Hostname

最佳答案

您可以对一个对象进行分组并返回分组的值。

var data = [{ Hostname: "abc123", name: "name1", Status: "PASS", Heading: "Not Applicable" }, { Hostname: "abc123", name: "name2", Status: "FAIL", Heading: "Not Applicable" }, { Hostname: "abc235", name: "name1", Status: "FAIL", Heading: "Not Applicable" }, { Hostname: "abc235", name: "name2", Status: "FAIL", Heading: "Not Applicable" }],
    keys = ["Status", "Heading"],
    result = Object.values(data.reduce((r, { Hostname, name, ...o }) => {
        r[Hostname] = r[Hostname] || { Hostname };
        keys.forEach(k => r[Hostname][name + k] = o[k]);
        return r;
    }, {}));

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

关于javascript - 如何在数组中使用reduce方法将具有公共(public)键的多个Json对象转换为单个Json对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61452889/

相关文章:

javascript - 使用 Node js 连接到 postgres

javascript - 从输入复制时获取文本

c++ - 结构数组作为函数参数

json - 如何从 JSON 对象流中获取第一个元素?

javascript - 更改 Google Charts (Google Visualization) Graph 的背景颜色

javascript - 如何在不重新加载的情况下在 react 路由器 v4 中推送路由

javascript - JS根据键值循环遍历数组并添加值

Python 字符串 "b"前缀(字节文字)

json - 为什么我无法解析带有 Unmarshal 嵌套数组的 json

java - Gson - 尝试将 json 字符串转换为自定义对象