Javascript-遍历树状对象并添加一个键

Javascript-遍历树状对象并添加一个键,javascript,object,Javascript,Object,假设我有一个深度为N的对象,如: food = { 'Non-Animal': { 'Plants' : { 'Vegetables': { ... } }, 'Minerals' : { ... } }, 'Animal': { .

假设我有一个深度为N的对象,如:

food = {
    'Non-Animal': {
        'Plants' : {
            'Vegetables': {
                ...
            }             
        },
            'Minerals' : {
                ...
            }
        },
    'Animal': {
        ...
    }
}
我想在这个对象中添加“水果”类别,但我必须搜索“植物”所在的对象,然后添加它。所以我不想在一句话中说:

food['Non-Animal']['Plants']['Fruits'] = {};
因为我想先搜索它的归属

在遍历对象时,如何将水果类别添加到对象中?到目前为止,我得到的是:

addCategory(food, category, parent);

function addCategory(obj, category, parent_name) {
    for (var key in obj) {
        if (key == parent_name) {
            obj[key][category] = {};
        }
        var p = obj[key];
        if (typeof p === 'object') {
            addCategory(p, category, parent);
        } else {

        }
    }
}

我如何修复此例程来执行此操作,或者有更好的方法来执行此操作

看起来不错。但是,您可能希望在添加道具后终止:

function addCategory(obj, category, parent_name) {
   for (var key in obj) {
      if (key == parent_name){
       return obj[key][category] = {};
      }
      var p = obj[key];
      if (typeof p === 'object') {
        if(addCategory(p, category, parent)) return true;
      } 
  }
}

如果我理解正确的话,我想你应该希望你的函数定义一个变量参数,它取你想要遍历的路径的单独名称,必要时创建

为此使用
.reduce()
,可以非常简单

const food={
“非动物”:{
“植物”:{
‘蔬菜’:{}
},
“矿物”:{}
},
“动物”:{}
}
控制台日志(添加类别(食品、非动物、植物、水果);
控制台日志(添加类别(食品、非动物、矿物、黄金);
函数addCategory(obj,…路径){
返回路径.reduce((curr,name)=>{
如果(!curr)返回空值;
if(!curr[name])返回(curr[name]={});
返回货币[名称];
//更简洁,但可能不太可读
//返回curr?curr[name]?curr[name]:(curr[name]={}):空;
},obj);
}

log(JSON.stringify(food,null,2))我只看到一个错误:addCategory的递归调用找不到父变量,因为它在您的作用域中被称为parent\u name

var食品={
“非动物”:{
“植物”:{
“蔬菜”:{
}
},
“矿物”:{}
},
“动物”:{}
}
函数addCategory(对象、类别、父项名称){
for(obj中的var键){
如果(键==父项名称){
obj[key][category]={};
}
var p=obj[键];
如果(p的类型=='object'){
添加类别(p、类别、父项名称);
}否则{
}
}
}
控制台.日志(食物);
添加类别(食品、水果、植物);

控制台.日志(食物)您可以使用reduce创建函数,该函数将键作为字符串,对象作为要分配给某个嵌套对象的值

var food={“非动物”:{“植物”:{“蔬菜”:{},“矿物”:{}},“动物”:{}}
函数添加(键、值、对象){
键.拆分('.').reduce(函数(r,e,i,arr){
如果(r[e]&&i==arr.length-1)Object.assign(r[e],value);
返回r[e]
},对象)
}
添加('非动物.植物',{'水果':{},食品)

console.log(food)
您可以使用
typeof p===“object”
检查watch out,因为如果
p
是任何类型的对象,例如
数组
,则为真。