首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript从嵌套对象构建嵌套对象

Javascript从嵌套对象构建嵌套对象
EN

Stack Overflow用户
提问于 2021-05-14 13:30:43
回答 4查看 64关注 0票数 0

我正在尝试从现有的深嵌套对象构建一个新对象。我似乎无法在递归模式下恢复头脑,但我遇到了一些麻烦:

代码语言:javascript
运行
复制
oldObjArr = [{
  id:1,
  name:"Record1"
},{
  id:2,
  name:"Record2"  
},{
  id:3,
  name:"Record3",
  kids:[{
    id: 4,
    name: "Child 3-1"
  },{
    id: 5,
    name: "Child 3-2"  
  }]
}]

buildTreeNodes = (node) => {
  let data = []
  node.map(record=>{
    record["icon"] = "..."
    record["color"] = "..."
    data.push(record)
    record.kids && buildTreeNodes(record.kids)
  })
} 
let newObjArr = buildTreeNodes(oldObjArr)

这显然不起作用,但我想不出是什么。生成的对象应该如下所示:

代码语言:javascript
运行
复制
[{
  id:1,
  name:"Record1",
  icon:"...",
  color: "...",
},{
  id:2,
  name:"Record2",
  icon:"...",
  color: "...",  
},{
  id:3,
  name:"Record3",
  icon:"...",
  color: "...",
  kids:[{
    id: 4,
    name: "Child 3-1",
    icon:"...",
    color: "...",
  },{
    id: 5,
    name: "Child 3-2",
    icon:"...",
    color: "...",
  }]
}]

谢谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-05-14 13:38:10

因此,您将遍历数组并接受每个对象,然后将您的道具添加到其中。然后,您检查是否存在孩子和一些检查是否是数组。我使用实例,但就像@Heretic点一样,它可以是Array.isArray。更重要的是,您可以在函数前面设置类型保护,检查数组参数是数组,然后这就不需要检查孩子是否是数组类型了。

代码语言:javascript
运行
复制
const oldObjArr = [{
  id:1,
  name:"Record1"
},{
  id:2,
  name:"Record2"  
},{
  id:3,
  name:"Record3",
  kids:[{
    id: 4,
    name: "Child 3-1"
  },{
    id: 5,
    name: "Child 3-2"  
  }]
}]

const addKeys = arr => {
  for(const obj of arr){
    obj['icon'] = "test"
    obj['color'] = "test"
    if("kids" in obj && obj.kids instanceof Array){
      addKeys(obj.kids);
    }
  }
}
  
addKeys(oldObjArr)
console.log(oldObjArr)

V2

代码语言:javascript
运行
复制
const addKeys = arr => {
  if(!Array.isArray(arr))
    return;
  for(const obj of arr){
    if(typeof obj !== "object")
      continue;
    obj['icon'] = "test"
    obj['color'] = "test"
    if("kids" in obj){
      addKeys(obj.kids);
    }
  }
}

票数 1
EN

Stack Overflow用户

发布于 2021-05-14 13:44:55

罗伯特的回答是正确的。

如果碰巧你也不想改变原来的对象,那么你可以这样做。

也使用ES6特性,因为为什么不。

代码语言:javascript
运行
复制
const oldObjArr = [{
  id: 1,
  name: "Record1"
}, {
  id: 2,
  name: "Record2"
}, {
  id: 3,
  name: "Record3",
  kids: [{
    id: 4,
    name: "Child 3-1"
  }, {
    id: 5,
    name: "Child 3-2"
  }]
}];

function transformObject(item) {
    if (Array.isArray(item.kids))
        return { 
            ...item, icon: '...', color: '...',
            kids: item.kids.map(transformObject)
        };
    else
        return {...item, icon: '...', color: '...' };
}

const newArray = oldObjArr.map(transformObject);
console.log(newArray);

票数 2
EN

Stack Overflow用户

发布于 2021-05-14 13:41:49

好的,看看这个:

代码语言:javascript
运行
复制
buildTreeNodes = (node) => {
  let data = node.map(record=>{
    record["icon"] = "..."
    record["color"] = "..."
    if (record.kids) record.kids = buildTreeNodes(record.kids);
    return record;
  })
  return data;
} 
let newObjArr = buildTreeNodes(oldObjArr)
console.log(newObjArr)

我想这就是你想要的。您必须在每次迭代record时返回map,它将直接添加到data数组中。内部递归的工作原理是一样的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67535213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档