我有一个 NodeJS 脚本,它以“键、值”对的形式从源获取数据,我想将该数据放入 JSON 对象中。
我正在使用 SNMP 来获取 k、v 对,其中 key 是 OID。然后,我想将这些值映射到 JSON 对象,而不必根据已知值迭代检查每个 OID。
k,v 对本身存储在对象中,我对此传入数据没有灵 active 。
let pair = {
key: "abc...",
value: "xyz..."
}
我已将 JSON 对象定义为空结构。
let jsonObject = {
ipaddress: "",
network: {
uptime: "",
throughput: "",
devices: ""
}
}
我遍历我的键(pairs
是包含 k,v 对象的数组的名称)
for (let i = 0; i < pairs.length; i++) {
if (pairs[i].key == "1.2.3.4.5.6.7") jsonObject.ipaddress = pairs[i].value;
if (pairs[i].key == "2.3.4.5.6.7.8") jsonObject.network.uptime = pairs[i].value;
if (pairs[i].key == "3.4.5.6.7.8.9") jsonObject.network.devices = pairs[i].value;
}
我想知道是否有任何方法可以简化这个过程,因为我有大约 200 个键需要处理(上面的代码只是一个示例),并且对于我来说迭代每个可能的键似乎并没有特别优化。
编辑:jsonObject 比此处显示的要复杂得多,有很多层,并且键的名称与所示的 json 对象属性名称不 1:1 匹配。
编辑 2:我知道这看起来很奇怪。 例如,我想采用 K,V 输入:
Key Value
1.2.3.4.5.6 "10.0.0.1"
2.3.4.5.6.7 "3 Days 14 Hours 32 Minutes"
3.4.5.6.7.8 "1.1.1.1"
并将其转换为不同名称的 JSON 对象
{
uptime: "3 Days 14 Hours 32 Minutes",
networking: {
ip: "10.0.0.1",
dns: "1.1.1.1"
}
}
可能使用某种形式的映射,而不是使用大约 200 个 if 语句
最佳答案
const { name, ...properties } = pairs.reduce(
(obj, { key, value }) => Object.assign(obj, { [key]: value }),
{}
)
const obj = { name, properties }
Reduce 会将数组缩减为标量,在本例中是一个对象,其中所有 k,v 对作为对象上的值字段,以 {}
开始作为默认值,每次合并每个 k,v 对 1。
Object.assign将合并对象,用右侧对象的键字段覆盖左侧对象。
最后,在对象文字上动态添加键的语法是 { [k]: v }
顺便说一下,这是一个有用的技巧,可以降低需要在循环中查找数组中的值的算法的复杂性。只需创建一个数组的索引,然后在循环中,在索引中查找即可。
关于javascript - 在 NodeJS 中将 K,V 对分配给 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60264357/