Javascript-遍历树状对象并添加一个键
假设我有一个深度为N的对象,如:Javascript-遍历树状对象并添加一个键,javascript,object,Javascript,Object,假设我有一个深度为N的对象,如: food = { 'Non-Animal': { 'Plants' : { 'Vegetables': { ... } }, 'Minerals' : { ... } }, 'Animal': { .
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
是任何类型的对象,例如数组
,则为真。