简体   繁体   English

过滤嵌套对象javascript

[英]Filter nested object javascript

For Example we have obj例如,我们有 obj

const obj {

    user: {
         firstName: 'ivan',
         lastName: 'Petrov',
         role: {
              roleID: '111',
              roleName: 'admin',
            },
       },
    user: {
         firstName: 'Vlad',
         lastName: 'Segeda',
         role: {
              roleID: '222',
              roleName: 'Moderator',
            },
       }

}

I need search and display data.我需要搜索和显示数据。 I create this filter, where "data"- its object, "params" - its value from search/filter input .我创建了这个过滤器,其中“数据” - 它的对象,“参数” - 它来自 search/filter input 的值。

export const filter = (data, params) => {
    const keys = data[0] ? Object.keys(data[0]) : [];
    return data.filter((item) => {
        return keys.some(key => item[key].toString().toLowerCase().indexOf(params.toLowerCase().toString()) !== -1)
    });
};

but this helper doesnt work properly.但是这个助手不能正常工作。 When I type in input Admin or Moderator.当我输入管理员或版主时。 it returns nothing.它什么都不返回。

I dont know, maybe i should use forEach....我不知道,也许我应该使用 forEach ....

Help me please请帮帮我

I assume data is an object similar to obj, then data[0] is undefined because data is an object, not an array.我假设 data 是一个类似于 obj 的对象,然后 data[0] 是未定义的,因为 data 是一个对象,而不是一个数组。

And if obj is an object, user as an object key is duplicate如果 obj 是一个对象,则 user 作为对象键是重复的

Let's say you have a recursive function that checks whether a user object values satisfy the input.假设您有一个递归函数来检查用户对象值是否满足输入。

const checkNestedRecursive = (obj, params) => {
    let flag = false;
    for(let key in obj) {
        if(typeof key === 'object') flag = flag || checkNestedRecursive(key, params);
        if(!flag) 
            flag = flag || obj[key].toString()
                            .toLowerCase()
                            .indexOf(params.toLowerCase().toString()) !== -1
        if(flag) return flag;
    }
    return flag;
}

Then you can filter your users:然后你可以过滤你的用户:

users.filter(user => checkNestedRecursive(user, params));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM