假设我有一个像这样的 n 元树结构(在 json 中):

[
  {
    "text": "Some title",
    "children": [
      {
        "text": "Some title",
        "children": [
          ...
        ]
      },
      ...
    ]
  }
]
我既不知道节点将有多少个 child ,也不知道树的深度。
我想做的是将所有 child 的属性 text 的名称更改为 name
我已经尝试过这个,使用递归函数 func :
func(tree) {
  if (!tree) return;

  for (let node of tree) {
    node.name = node.text
    delete node.text;

    return func(node.children);
  }
}
但它没有用。我该怎么做?

最佳答案

我会说,您的代码的主要问题是 node 变量保存了相应数组项的值,并且它不保留对这些项本身的引用,因此,基本上,您尝试进行的更改永远不会应用于原始数组(但仅限于在每次循环迭代时重新分配的临时变量)
如果您更喜欢改变原始数组并为此目的使用 for( -loops 感到舒服,那么最好使用 for(..in -loop 通过它们的键访问数组项:

const src = [
  {
    text: "Some title",
    children: [
      {
        text: "Some title",
        children: []
      },
    ]
  }
],

    func = tree => {
      for(const nodeIdx in tree){
        const {text:name, children} = tree[nodeIdx]
        func(children)
        tree[nodeIdx] = {name, children}
      }
    }

func(src)

console.log(src)
.as-console-wrapper{min-height:100%;}

但是,我会避免改变源数据并返回新数组(例如使用 Array.prototype.map() :

const src = [
  {
    text: "Some title",
    children: [
      {
        text: "Some title",
        children: []
      },
    ]
  }
],

      func = tree =>
        tree.map(({text:name,children}) => ({
          name,
          ...(children && {children: func(children)})
        }))


console.log(func(src))
.as-console-wrapper{min-height:100%;}

关于javascript替换n元树对象中的属性名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63837761/

10-12 07:05