首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有办法在深嵌套对象数组中连接父值?

是否有办法在深嵌套对象数组中连接父值?
EN

Stack Overflow用户
提问于 2022-10-13 17:12:23
回答 1查看 29关注 0票数 1

我有一个嵌套对象数组。我需要通过连接每个节点的所有父名来更新其id属性。

id应该是当前节点的name属性的值,该属性与名称属性连接在一起,其父属性由'/‘分隔

代码语言:javascript
复制
treeData = [{
    name: 'Infiniti',
    id: '',
    children: [{
        name: 'G50',
        id: '',
        children: [{
            name: 'Pure AWD',
            id: ''
          },
          {
            name: 'Luxe',
            id: ''
          },
        ],
      },
      {
        name: 'QX50',
        id: '',
        children: [{
            name: 'Pure AWD',
            id: ''
          },
          {
            name: 'Luxe',
            id: ''
          },
        ],
      },
    ],
  },
  {
    name: 'BMW',
    id: '',
    children: [{
        name: '2 Series',
        id: '',
        children: [{
            name: 'Coupé',
            id: ''
          },
          {
            name: 'Gran Coupé',
            id: ''
          },
        ],
      },
      {
        name: '3 Series',
        id: '',
        children: [{
            name: 'Sedan',
            id: ''
          },
          {
            name: 'PHEV',
            id: ''
          },
        ],
      },
    ],
  },
];

预期结果

代码语言:javascript
复制
[{
    name: 'Infiniti',
    id: 'Infiniti',
    children: [{
        name: 'G50',
        id: 'Infiniti/G50',
        children: [{
            name: 'Pure AWD',
            id: 'Infiniti/G50/Pure AWD'
          },
          {
            name: 'Luxe',
            id: 'Infiniti/G50/Luxe'
          },
        ],
      },
      {
        name: 'QX50',
        id: 'Infiniti/QX50',
        children: [{
            name: 'Pure AWD',
            id: 'Infiniti/QX50/Pure AWD'
          },
          {
            name: 'Luxe',
            id: 'Infiniti/QX50/Luxe'
          },
        ],
      },
    ],
  },
  {
    name: 'BMW',
    id: 'BMW',
    children: [{
        name: '2 Series',
        id: 'BMW/2 Series',
        children: [{
            name: 'Coupé',
            id: 'BMW/2 Series/Coupé'
          },
          {
            name: 'Gran Coupé',
            id: 'BMW/2 Series/Gran Coupé'
          },
        ],
      },
      {
        name: '3 Series',
        id: 'BMW/3 Series',
        children: [{
            name: 'Sedan',
            id: 'BMW/3 Series/Sedan'
          },
          {
            name: 'PHEV',
            id: 'BMW/3 Series/PHEV'
          },
        ],
      },
    ],
  },
];

我尝试使用Array.prototype.reduce(),但无法获得前一个值来连接。

代码语言:javascript
复制
    function updateTreeData(array) {
      return array.reduce((returnValue, currentValue) => {
        if (currentValue.children != null) {
          returnValue.push(Object.assign({}, currentValue, {
            children: this.updateTreeData(currentValue.children)
          }))
        }
        return returnValue
      }, []);
    }

    console.log(updateTreeData(treeData))

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-13 17:23:05

您可以尝试递归方法。

代码语言:javascript
复制
const treeData=[{name:"Infiniti",id:"",children:[{name:"G50",id:"",children:[{name:"Pure AWD",id:""},{name:"Luxe",id:""}]},{name:"QX50",id:"",children:[{name:"Pure AWD",id:""},{name:"Luxe",id:""}]}]},{name:"BMW",id:"",children:[{name:"2 Series",id:"",children:[{name:"Coupé",id:""},{name:"Gran Coupé",id:""}]},{name:"3 Series",id:"",children:[{name:"Sedan",id:""},{name:"PHEV",id:""}]}]}];

const populateId = (list, currentId) => {
    for(const item of list) {
     if(!currentId) {
           item.id = item.name
     } else {
        item.id = currentId + '/' + item.name
     }
     if(item.children) {
        populateId(item.children, item.id)
     }
  }
}


populateId(treeData)

console.log(treeData)

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

https://stackoverflow.com/questions/74059492

复制
相关文章

相似问题

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