Рекурсивно измените имя вложенного свойства объекта

#javascript

Вопрос:

У меня есть объект с вложенными полями, отличными от именованного подпункта, мне нужно изменить имена этого поля на дочерние.

Как можно аккуратно реализовать эту функциональность, возможно, есть способы помимо рекурсии?

 let data = [
  {
    name: 'Alex',
    subItem: [
      {
        name: 'Den',
        subItem: [
          
        ]
      }
    ]
  }
]

function transformData = (data) => {
  return data.map(stat=>{
    
  })
}

console.log(transformData(data))
 

//шоуд быть

 let data = [
  {
    name: 'Alex',
    children: [
      {
        name: 'Den',
        children: []
      }
    ]
  }
]
 

Комментарии:

1. Может ли быть больше уровней вложенности или только столько?

2. более 1 уровней

3. Значит, она динамична? а это значит, что уровней может быть много?

4. да, много уровней

Ответ №1:

Javascript уже включает в себя рекурсивный преобразователь объектов JSON. stringify с replacer функцией:

 let data = [
  {
    name: 'Alex',
    subItem: [
      {
        name: 'Den',
        subItem: [ {name: 'Foo', subItem: []} ],
      }
    ]
  }
]



JSON.stringify(data, function(_, v) {
    if (v.subItem) {
        v.children = v.subItem
        delete v.subItem
    }
    return v
})

console.log(data) 

В простом случае, подобном этому, вы также можете просто напрямую управлять строкой JSON:

 newData = JSON.parse(
    JSON.stringify(data)
        .replaceAll(`"subItem":`, `"children":`))
 

Комментарии:

1. Это выглядит хорошо, но что, если объект содержит текст с подэлементом заголовка: (

2. @Ксения: "subItem": может совпадать только с ключом в JSON, а не со значением или его частью.