【问题标题】:From flat to nested object recursively javascript从平面到嵌套对象递归javascript
【发布时间】:2020-10-06 04:26:36
【问题描述】:

我有一个扁平的对象数组:

let x = [
   {parentKeyid: null,children:[]},
   {parentKeyid: 0,   children:[]},
   {parentKeyid: 1,   children:[]}
];

我想从这个到嵌套对象数组:

const res = [{
  parentKeyid: null, 
  children: [{ 
      parentKeyid: 0,
      children:[{
        parentKeyid: 1, 
        children:[] 
      }]
  }]
}]

这是我的代码:

let x = [{
  parentKeyid: null,
  children:[]
},
{
  parentKeyid: 0,
  children:[]
},
{
  parentKeyid: 1,
  children:[]
}];

function recursively(arr) {
    if (arr.length === 1) {
        let objToReturn = {
            parentKeyid: arr[0].parentKeyid,
            children: arr[0].children
        }
        return objToReturn
    }
    let transformedArr = arr.splice(0,1);
    transformedArr[0].children.push(recursively(arr));
    return transformedArr
}
let stringified = JSON.stringify(recursively(x), null, ' ');
console.log(stringified)

正如你所见,我几乎得到了我想要的,但我不知道如何在没有 arr 的情况下将对象推入 children 属性

【问题讨论】:

  • "几乎得到我想要的" - 你发布的 sn-p 似乎有效。你怎么弄错了结果?
  • 您的数据中的id 缺失。您只有父 ID,没有其他参考。
  • @Bergi 在我的对象中,其中 parentKeyId 具有 null 属性我的子属性是 [[obj]],我需要 [obj],如果我的 obj 数组变宽,我将得到 [[]]的 []
  • 哦,对了。我想你正在寻找return transformedArr[0]。
  • 或者更确切地说是const objToReturn = arr.shift(); objToReturn.children.push(recursively(arr)); return objToReturn;,以更清楚地表明您不想要“转换后的列表”,而实际上只是数组的第一个元素。

标签: javascript arrays recursion javascript-objects


【解决方案1】:

鉴于您已经有一个可以直接访问每个元素的数组,因此您不需要递归解决方案。此外,您当前的解决方案实际上并未考虑parentKeyid,它只是将数组转换为嵌套列表。我想你真正要找的是

const x = [
   {parentKeyid: null,children:[]},
   {parentKeyid: 0,   children:[]},
   {parentKeyid: 1,   children:[]},
   {parentKeyid: 0,   children:[]},
   {parentKeyid: 2,   children:[]},
   {parentKeyid: 1,   children:[]},
];

const roots = [];
for (const el of x) {
    if (el.parentKeyid == null) {
        roots.push(el);
    } else {
        x[el.parentKeyid].children.push(el);
    }
}
console.log(JSON.stringify(roots, null, ' '));

【讨论】:

  • 递归解决方案更适合我。我想创建一个嵌套列表,但您在 cmets 中的提示帮助了我。
猜你喜欢
  • 1970-01-01
  • 2021-03-04
  • 2018-04-20
  • 2012-02-12
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 2018-07-22
相关资源
最近更新 更多