javascript - JSON 操作,重写一个新数组,将数据附加为子项
问题描述
我有一个 JSON:
var json = [{
"name": "0xcd963fe5b4d9de5380130d6c6b6cfb5d3b903b1f",
"parent": "null"
}, {
"name": "0xe8f84d8ad5850d66bd289ce3199753c35f4cbf40",
"parent": "0xcd963fe5b4d9de5380130d6c6b6cfb5d3b903b1f"
}, {
"name": "0x8fa01b60f503a3873c1b02ef351112f57cdd818e",
"parent": "0xe8f84d8ad5850d66bd289ce3199753c35f4cbf40"
}, {
"name": "0x753a018eca49f1b1e8b46b88d6a7b449478740e0",
"parent": "0xcd963fe5b4d9de5380130d6c6b6cfb5d3b903b1f"
}]
我正在尝试使用 Javascript 将其重写为一个新的 JSON,其排序如下:
var json = [{
"name": "0xcd963fe5b4d9de5380130d6c6b6cfb5d3b903b1f",
"parent": "null",
"children": [{
"name": "0x753a018eca49f1b1e8b46b88d6a7b449478740e0",
"parent": "0xcd963fe5b4d9de5380130d6c6b6cfb5d3b903b1f"
}, {
"name": "0xe8f84d8ad5850d66bd289ce3199753c35f4cbf40",
"parent": "0xcd963fe5b4d9de5380130d6c6b6cfb5d3b903b1f",
"children": [{
"name": "0x8fa01b60f503a3873c1b02ef351112f57cdd818e",
"parent": "0xe8f84d8ad5850d66bd289ce3199753c35f4cbf40"
}]
}]
}]
将创建子对象并将其嵌套到其父对象。每个名称都是唯一的,第一个对象没有父对象(“null”),并且对象可能没有子对象(“null”或空数组 [])。
我不习惯 javascript,我不确定我能做到这一点,我尝试了各种循环但没有工作,因为:
json.forEach(function(link) {
var parent = link.parent = nodeByName(json,link.parent),
child = link.children = nodeByName(json,link.children);
if (parent.children) parent.children.push(child);
else parent.children = [child];
});
但是这个结果为:
[{
"name": "0xcd963fe5b4d9de5380130d6c6b6cfb5d3b903b1f",
"parent": {
"name": "null",
"children": [{}]
},
"children": {}
}, {
"name": "0xe8f84d8ad5850d66bd289ce3199753c35f4cbf40",
"parent": {
"name": "0xcd963fe5b4d9de5380130d6c6b6cfb5d3b903b1f",
"children": [{}, {}]
},
"children": {}
}, {
"name": "0x8fa01b60f503a3873c1b02ef351112f57cdd818e",
"parent": {
"name": "0xe8f84d8ad5850d66bd289ce3199753c35f4cbf40",
"children": [{}]
},
"children": {}
}, {
"name": "0x753a018eca49f1b1e8b46b88d6a7b449478740e0",
"parent": {
"name": "0xcd963fe5b4d9de5380130d6c6b6cfb5d3b903b1f",
"children": [{}, {}]
},
"children": {}
}]
解决方案
您可以将reduce()
, 与递归函数结合使用(以支持许多嵌套的子级别):
function getChildren (name, items) {
return items
.filter(({ parent }) => parent === name)
.map(item => ({...item, children: getChildren(item.name, json)}));
}
const resultAsObject = json.reduce((accum, {name, parent}) => {
if (parent === "null") {
accum[name] = { name, parent, children: getChildren(name, json) };
}
return accum;
}, {});
const resultAsArray = Object.values(resultAsObject);
推荐阅读
- firebase - FCM 可以向其发送通知的用户段中的设备是否存在限制
- django - 在 Django 的 python shell 中创建模型及其关联
- r - 找出长度不同的两列的行之间哪些字符串相同
- json - json 文件错误:“预期为 json 对象、数组或文字”
- node.js - 在 node express hbs 中存储图像 - 选择什么方式?
- node.js - TypeError:无法读取 null 的属性“文件”
- asp.net-mvc - Datatables ajax 发布请求失败,状态码为 500
- java - BufferedReader 不读取最后一行
- javascript - 条件导入:如果存在则导入
- wordpress - 如何在 WordPress 中为合格产品添加自定义图标徽章