遍历出数组中所有对象为id的值

const lists=[
    {
        _list_name:'订单中心',_list:[
            {name:'门店补货审核',
                _listThird:[
                    {name:'补货汇总审核',url:'add_goods_all_check.html',className:'allcheck'},
                    {name:'补货特殊审核',url:'add_goods_special_check.html',className:'specialcheck'},
                    {name:'已审核补货单查询',url:'add_goods_has_check.html',className:'hascheck'}
                ],id:'store_check'
            },
              {name:'加配作业',
                  _listThird:[
                      {name:'加配计划',url:'add_goods_plan.html',className:'plan'}
                ],id:'add_work'
              },
              {name:'物流仓库补货',
                  _listThird:[
                      {name:'DC补货',url:'add_goods_dc.html',className:'dc'}
                ],id:'store_add'
              }
        ],id:'order_center'
    },{
        _list_name:'补货中心',_list:[
            {name:'交易前',
                _listThird:[
                    {name:'智能补货',url:'add_goods_smart.html',className:''},
                    {name:'手工补货',url:'add_goods_hand.html',className:''},
                    {name:'特殊补货',url:'add_goods_special.html',className:''},
                    {name:'补货单查询',url:'add_goods_secrch.html',className:''}
                ],id:'order_before'
            },
              {name:'交易中',
                  _listThird:[
                      {name:'加配单查询',url:'add_goods_query.html',className:''}
                ],id:'order_ing'
              },
              {name:'交易后',
                  _listThird:[
                      {name:'补货单明细跟踪',url:'add_goods_detail_track.html',className:''}
                ],id:"order_after"
              }
        ],id:'add_goods_center'
    }]
便利出所有的id,将id对应的value值设为0;
结果这样
    var json={
        'order_center':0,
        'store_check':0,
        'add_work':0,
        'store_add':0,
        'order_before':0,
        'order_ing':0,
        'order_after':0,
        'add_goods_center':0
    }
阅读 6.2k
3 个回答

贴一种更快捷的方式,就是把原来的json数组串行化,然后通过正则去匹配,再从捕获组中去提取,要注意的是:如果用JSON.stringify(lists)串行化后,原来的id就会被双引号包裹,值也从单引号包裹变成双引号;还有就是正则表达式一定要加g这个修正符,这样才能让exec一直匹配下去

var listsStr=JSON.stringify(lists);
var pattern=/,"id":"([^"]+)"/g;
var matchStr;
var json={};
while(matchStr=pattern.exec(listsStr)){
    // console.log(matchStr[1]);
    json[matchStr[1]]=0;
}
console.log(json);

clipboard.png

var json = {};
for (let i = 0; i < lists.length; i++) {

if (lists[i].hasOwnProperty('_list') && Array.isArray(lists[i]['_list'])) {
    for (let j = 0; j < lists[i]['_list'].length; j++) {
        lists[i]['_list'][j].hasOwnProperty('id') ?
            json[lists[i]['_list'][j]['id']] = 0 : null;
    }
}
lists[i].hasOwnProperty('id') ? json[lists[i]['id']] = 0 : null;

}

console.log(json);

    var json = {};

    function fn(target){
        // 数组或者伪数组
        if( target.length ){
            // 遍历数组
            for( var i = 0 , l = target.length ; i < l ; i++ ){
                // 如果是数组或者对象,再次调用
                if(typeof target[i] === 'object'){
                    fn(target[i]);
                }
            }

        }else if(typeof target === 'object'){
            // 对象
            for( var key in target ){
                // 如果是数组或者对象,再次调用
                if( typeof target[key] === 'object' ){
                    fn(target[key])
                }

                if( key === 'id'){
                    json[target[key]] = 0
                }
            }
        }
        
    }
    fn(lists)
    console.log(json);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题