Javascript 查找对象中出现的所有关键点并更改值

Javascript 查找对象中出现的所有关键点并更改值,javascript,Javascript,我想找到所有发生的键并更改其值。我希望将整个对象中的id和名称更改为新值 const myObj = { id: 1, name: "a", children: [ { id: 2, name: "b", children: [ { id: 3, name: "c", } ] },

我想找到所有发生的键并更改其值。我希望将整个对象中的id和名称更改为新值

const myObj = {
  id: 1,
  name: "a",
  children: [
    {
      id: 2,
      name: "b",
      children: [
        {
          id: 3,
          name: "c",   
        }
      ]
    },
    {
      id: 4,
      name: "d",
      children: [
        {
          id: 5,
          name: "e",
          children: [
            {
              id: 6,
              name: "f",
              children: [
                {
                  id: 7,
                  name: "g",  
                }
              ]
            }
          ]
        }
      ]
    },
  ]
}
我试过的代码,不确定如何获得两个属性并更改它们的值

function findAllByKey(obj, id, name) {
  let constObj = Object.entries(obj);
  console.log(obj)
  Object.entries(constObj)
    .reduce(([key, value]) => (key === id)
      ? obj[key] = "123"
      : (typeof value === 'object'))
      
  return obj;
}

// USAGE, 
console.log(findAllByKey(myObj, 'id', 'name'))

您需要为此使用递归

Dave Newton给出了一个很好的论据,他说
子属性
包含了您想要更改的大多数属性,因此我建议您循环检查每个
子属性
并以这种方式更改它们的ID。然而,我给你的答案将适用于更一般的情况(对于那些可能需要不同方法的人)

函数findAllByKeyAndReplace(对象、键、替换){
常量活套=功能(obj){
for(让k在obj中){
如果(k==键){
obj[k]=替换;
}
else if(“对象”==对象的类型[k]){
活套(obj[k]);
}
}
}
活套(对象);
}
常数myObj={
id:1,
名称:“a”,
儿童:[
{
id:2,
名称:“b”,
儿童:[
{
id:3,
名称:“c”,
}
]
},
{
id:4,
名称:“d”,
儿童:[
{
id:5,
名称:“e”,
儿童:[
{
id:6,
名称:“f”,
儿童:[
{
id:7,
名称:“g”,
}
]
}
]
}
]
},
]
}
Findalllbykeyanderplace(myObj,“id”,“123”);
Findalllbykeyanderplace(myObj,“名称”、“腌菜”);

console.log(myObj)这些是嵌套的,对吗?很可能您需要利用递归。它们是嵌套的。。。是的。为了澄清一下,您想更改所有名为“id”的属性及其值吗?不仅仅是嵌套在“children”中的那些?您不想对
children
中的每个项调用相同的方法吗?这看起来像是一个标准的递归过程。@Reality:是的,所有发生的id和名称都要更改..我试着使用reduce和recursion,但似乎有些地方出了问题。我在Object.entries等方面没有那么先进,但为什么要使用
reduce
?你不能使用
.forEach
?@Reality任何可以用递归解决的问题都可以用迭代解决。因此,OP不需要使用递归。在某些情况下,迭代将被优先用于最小化调用堆栈的深度。裁判:@MattMorgan-Huh,我得找个时间调查一下。不过,我在高级逻辑方面做得不好,我必须在这方面做一些改进。然而,对于我们这些缺乏高级(或更高)逻辑和数学知识的人来说,递归目前还不错。