Javascript-遍历对象并更新属性

Javascript-遍历对象并更新属性,javascript,recursion,iteration,tree-traversal,Javascript,Recursion,Iteration,Tree Traversal,我希望有人能给我指出正确的方向 我有一个JavaScript对象,如下所示 var category = [{ isExpanded: false, name: "Electricals", subcategories: [{ isExpanded: false, name: "Audio", subcategories: null }, { isExpanded: false, na

我希望有人能给我指出正确的方向

我有一个JavaScript对象,如下所示

var category = [{
    isExpanded: false,
    name: "Electricals",
    subcategories: [{
        isExpanded: false,
        name: "Audio",
        subcategories: null
    }, {
        isExpanded: false,
        name: "Photography",
        subcategories: null
    }]
}, {
    isExpanded: false,
    name: "Telecoms",
    subcategories: [{
        isExpanded: false,
        name: "Mobile",
        subcategories: null
    }, {
        isExpanded: false,
        name: "Sim-cards",
        subcategories: null
    }]
}, {
    isExpanded: false,
    name: "Entertainment",
    subcategories: [{
        isExpanded: false,
        name: "Gaming",
        subcategories: [{
            isExpanded: false,
            name: "Games",
            subcategories: null
        }]
    }, {
        isExpanded: false,
        name: "Sports",
        subcategories: null
    }]
}];
我的目标是遍历每个类别/子类别,并根据我的逻辑设置“isExpandable”的值。有人能告诉我如何遍历对象的每个子类别,并记住一个子类别和一个子类别等等吗

这是我目前的尝试

function blah() {
  for (var i = 0; i < category.length; i++) {
    if (category[i].subcategories) {
      console.log(category[i]);
      traverseCategoryTree(category[i]);
    }
  }
}

function traverseCategoryTree(category) {
  //iterate each subcategory and update is Expanded. 
}

blah();
函数blah(){
对于(变量i=0;i
函数遍历类别树(类别){
对于(变量i=0,len=categories.length;i
函数遍历类别树(类别){
对于(变量i=0,len=categories.length;i
不要重新发明轮子。我们现在使用的是大部分数据处理。只要你把头绕在它身上,它就会很强大。以下是您的示例的工作方式:

//const objectScan=require('object-scan');
常量修改=(数据)=>objectScan(['***]']{
rtn:'计数',
filterFn:({value})=>{
value.isExpandable=(
Array.isArray(value.subcategories)
&&value.subcategories.length!==0
);
}
})(数据);
const category=[{isExpanded:false,name:'Electricals',子类别:[{isExpanded:false,name:'Audio',子类别:null},{isExpanded:false,name:'Photography',子类别:null},{isExpanded:false,name:'Telecoms',子类别:[{isExpanded:false,name:'Mobile',子类别:null},{isExpanded:false,名称:'Sim卡',子类别:null}]},{isExpanded:false,名称:'Entertainment',子类别:[{isExpanded:false,名称:'Gaming',子类别:[{isExpanded:false,名称:'Sports',子类别:null}]};
console.log(modify(category));//找到多少个匹配的
// => 10
控制台日志(类别);
//=>[{isExpanded:false,名称:'Electricals',子类别:[{isExpanded:false,名称:'Audio',子类别:null,isExpanded:false},{isExpanded:false,名称:'Photography',子类别:null,isExpandable:false}],isExpanded:true},{isExpanded:false,名称:'Telecoms',子类别:[{isExpanded:false,名称:'Mobile',子类别:null,isExpandable:false},{isExpanded:false,名称:'Sim卡',子类别:null,isExpandable:false}],isExpandable:true},{isExpanded:false,名称:'Entertainment',子类别:[{isExpanded:false,名称:'Gaming',子类别:[{isExpanded:false,名称:'Games',子类别:null,isExpandable:false}],isExpandable:true},{isExpanded:false,名称:'Sports',子类别:null,isExpandable:false}],isExpandable:true}]
。作为控制台包装{最大高度:100%!重要;顶部:0}

不要重新发明轮子。我们现在使用的是大部分数据处理。只要你仔细思考,它就会非常强大。下面是它在你的示例中的工作方式:

//const objectScan=require('object-scan');
常量修改=(数据)=>objectScan(['***]']{
rtn:'计数',
filterFn:({value})=>{
value.isExpandable=(
Array.isArray(value.subcategories)
&&value.subcategories.length!==0
);
}
})(数据);
const category=[{isExpanded:false,name:'Electricals',子类别:[{isExpanded:false,name:'Audio',子类别:null},{isExpanded:false,name:'Photography',子类别:null},{isExpanded:false,name:'Telecoms',子类别:[{isExpanded:false,name:'Mobile',子类别:null},{isExpanded:false,名称:'Sim卡',子类别:null}]},{isExpanded:false,名称:'Entertainment',子类别:[{isExpanded:false,名称:'Gaming',子类别:[{isExpanded:false,名称:'Sports',子类别:null}]};
console.log(modify(category));//找到多少个匹配的
// => 10
控制台日志(类别);
//=>[{isExpanded:false,名称:'Electricals',子类别:[{isExpanded:false,名称:'Audio',子类别:null,isExpanded:false},{isExpanded:false,名称:'Photography',子类别:null,isExpandable:false}],isExpanded:true},{isExpanded:false,名称:'Telecoms',子类别:[{isExpanded:false,名称:'Mobile',子类别:null,isExpandable:false},{isExpanded:false,名称:'Sim卡',子类别:null,isExpandable:false}],isExpandable:true},{isExpanded:false,名称:'Entertainment',子类别:[{isExpanded:false,名称:'Gaming',子类别:[{isExpanded:false,名称:'Games',子类别:null,isExpandable:false}],isExpandable:true},{isExpanded:false,名称:'Sports',子类别:null,isExpandable:false}],isExpandable:true}]
。作为控制台包装{最大高度:100%!重要;顶部:0}

使用递归函数使用递归函数
function traverseCategoryTree(categories) {
  for (var i = 0, len = categories.length; i < len; i++) {
    console.log(categories[i]);
    if (categories[i].subcategories) {
      traverseCategoryTree(categories[i].subcategories);
    }
  }
}    

traverseCategoryTree(category);