js循环过滤json对象数组

1、首先有一个对象列表,结构如下

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数组来做限制:
限制规则如下(假设要从objectList取出childId=‘child1’且type的值包含‘seach’的对象):
1、如果authList数组为空,那么忽略type,直接过滤objectList,得到结果。
结果应该是object1和object2两个对象。

2、如果authList不为空且数组结构如下,那么则应该在步骤1的基础上还要进行操作:

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

那么此时应该根据authList表的type字段来进行判断。结果应该是object2和object3两个对象。(authList的第一条记录的type中没有seach,不符合条件;第二条记录的type有search,所以将object3也添加到结果中);

请问怎么优雅的实现上述功能呢?尝试写了一下,感觉代码都是相当的复杂而且一会儿就把自己绕晕了。请大神指教。

阅读 5.6k
3 个回答

你给的数据中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);

你把我绕晕了

已解决,想了个相对简单点的写法。。。。欢迎大家提出更简单的写法~~

 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("最终结果", _list);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题