javascript - 对象数组转换为嵌套数组
问题描述
- 输出结果的根元素具有相同的 id 和 parent_aid。- 下一个对象键 id 具有与 root 相同的 parent_id id,然后它以相同的方式继续。- 我尝试了函数,但每次它只给出一个对象时都无法实现它。
- 我已经添加了我的代码和我期望的输出。
let input = [
{
'id': "1",
'parent_aid': "1",
},
{
'id': "2",
'parent_aid': "1",
},
{
'id': "3",
'parent_aid': "2",
},
{
'id': "4",
'parent_aid': "3",
},
{
'id': "5",
'parent_aid': "4",
},
{
'id': "6",
'parent_aid': "5",
},
{
'id': "8",
'parent_aid': "7",
},
{
'id': "7",
'parent_aid': "6",
},
{
'id': "9",
'parent_aid': "8",
},
{
'id': "10",
'parent_aid': "9",
},
{
'id': "11",
'parent_aid': "10",
},
{
'id': "12",
'parent_aid': "11",
},
];
// output result should be
const result = {
"1": {
"value": {
"id": "1",
"parent_aid": "1"
},
"2": {
"value": {
"id": "2",
"parent_aid": "1"
},
"3": {
"value": {
"id": "3",
"parent_aid": "2"
},
"4": {
"value": {
"id": "4",
"parent_aid": "3"
},
"5": {
"value": {
"id": "5",
"parent_aid": "4"
},
"6": {
"value": {
"id": "6",
"parent_aid": "5"
},
"7": {
"id": "7",
"parent_aid": "6"
}
}
}
}
}
}
}
}
let output = {};
let getChildObject = (arr, parentID, obj) => {
if(!parentID) return;
return arr.find(val => (val.parent_aid === parentID));
}
const makeNestedObjWithArrayItemsAsKeys = (arr) => {
let rootIndex = arr.findIndex(val => (val.aid == val.parent_aid));
let root = arr[rootIndex];
arr.slice(rootIndex)
output[root.aid] = { value: root }
let prev= root.aid;
for(let i = 0; i < input.length - 1; i++) {
const childObj = getChildObject(arr, prev);
if(childObj) {
const value = output[prev];
let key = childObj['id']
console.log("ccc",key)
output[prev][key] = { value: childObj}
prev = childObj['id'];
}
};
return output
};
makeNestedObjWithArrayItemsAsKeys(input);
解决方案
我做了一些评论,因为我认为您的示例定义不正确(输出中缺少节点,并且叶子没有value
属性)。
您可以使用 a来存储由它们的值map
作为键的最终节点。id
然后,在再次迭代数据时,您可以建立这些对象之间的关系并确定根。
这是代码:
let input = [{'id': "1",'parent_aid': "1",},{'id': "2",'parent_aid': "1",},{'id': "3",'parent_aid': "2",},{'id': "4",'parent_aid': "3",},{'id': "5",'parent_aid': "4",},{'id': "6",'parent_aid': "5",},{'id': "7",'parent_aid': "6",},];
let map = new Map(input.map(value => [value.id, { value }]));
let root;
for (let {id, parent_aid} of input) {
if (id !== parent_aid) map.get(parent_aid)[id] = map.get(id);
else root = { [id]: map.get(id) };
}
console.log(root);
请注意,在 JavaScript 对象中,表示数字的属性(最多限制)在其他属性之前被迭代/列出,因此您会看到上面的代码片段value
在数字之后输出属性。
推荐阅读
- osascript - osascript 使用包含路径的变量更改壁纸失败
- google-drive-api - 在 Google Drive Api 上更新领域文件
- firebase - Firebase 动态链接未推送到 Flutter 页面
- java - 使用带有 PKI SIM 的外部签名的 iText 签名 PDF
- java - 如何使用java将泰语单词从CSV文件保存到数据库表中?
- bash - 删除 kubectl 命令返回的标题行
- c# - POST 方法仅适用于我的本地计算机,但不适用于远程服务器
- excel - 圆形生日的条件格式作为提醒
- python - 如何在其他执行中创建不同的 txt.name
- hibernate - 是否可以使用@manytomany 关系仅关联数据库中已经存在的对象?