鍍金池/ 問答/Python  HTML/ js循環(huán)過濾json對象數(shù)組

js循環(huán)過濾json對象數(shù)組

1、首先有一個對象列表,結(jié)構(gòu)如下

objectList=[
    {
        objectId:'object1',   // 對象Id
        objectName: '對象1',  // 對象名稱
        parentId:'parent1',  // 父用戶Id
        childId: 'child1'    // 子用戶Id
    },
    {
        objectId:'object2',
        objectName: '對象2', 
        parentId:'parent1', 
        childId: 'child1'   
    },
    {
        objectId:'object3',
        objectName: '對象3',
        parentId:'parent1',
        childId: 'child2'
    },
    {
        objectId:'object4',
        objectName: '對象4',
        parentId:'parent1',
        childId: 'child3'
    }]

目的是給出一個childId,返回objectList表中所有符合條件的對象。

這個不僅僅是filter一下這么簡單,還有一個authList數(shù)組來做限制:
限制規(guī)則如下(假設(shè)要從objectList取出childId=‘child1’且type的值包含‘seach’的對象):
1、如果authList數(shù)組為空,那么忽略type,直接過濾objectList,得到結(jié)果。
結(jié)果應(yīng)該是object1和object2兩個對象。

2、如果authList不為空且數(shù)組結(jié)構(gòu)如下,那么則應(yīng)該在步驟1的基礎(chǔ)上還要進行操作:

authList=[
        {
            objectId:'object1',
            childId: 'child1',
            type:'add,delete'
        },
        {
            objectId:'object3',
            childId: 'child1',
            type:'seach'
        },
 ]

那么此時應(yīng)該根據(jù)authList表的type字段來進行判斷。結(jié)果應(yīng)該是object2和object3兩個對象。(authList的第一條記錄的type中沒有seach,不符合條件;第二條記錄的type有search,所以將object3也添加到結(jié)果中);

請問怎么優(yōu)雅的實現(xiàn)上述功能呢?嘗試寫了一下,感覺代碼都是相當(dāng)?shù)膹?fù)雜而且一會兒就把自己繞暈了。請大神指教。

回答
編輯回答
命多硬

你把我繞暈了

2017年7月23日 17:08
編輯回答
心夠野

你給的數(shù)據(jù)中authList里的 search拼錯了.

var childId = 'child1';
var type = 'search';
Object.values(objectList.concat(authList).filter(o=>o.childId === childId)
    .reduce((t, c)=> { 
            !!t[c.objectId] ? t[c.objectId].type = (t[c.objectId].type || c.type) 
            : t[c.objectId] = c;
            return t;
    }, {}))
    .filter(o=> !o.type || o.type.indexOf(type)>-1)
    .map(o=>o.objectId);
2018年6月12日 09:06
編輯回答
陪我終

已解決,想了個相對簡單點的寫法。。。。歡迎大家提出更簡單的寫法~~

 var childId = 'child1';
    var type = 'search';
    let _list = [];
    objectList.forEach(object => {
        if(object.childId == childId){
            let flag = false;
            authList.forEach(auth => {
                if(auth.objectId==object.objectId){
                    flag = true;
                    if(auth.type.indexOf(type)>-1){
                        _list.push(object);
                    }
                }
            })
            if(!flag){
                _list.push(object);
            }
        }else{
            authList.forEach(auth => {
                if(auth.objectId==object.objectId && auth.type.indexOf(type)>-1){
                    _list.push(object);
                }
            })
        }
        
    })
    console.log("最終結(jié)果", _list);
2018年2月4日 08:12