过滤嵌套对象javascript

过滤嵌套对象javascript,javascript,dictionary,methods,filter,Javascript,Dictionary,Methods,Filter,例如,我们有obj const obj { user: { firstName: 'ivan', lastName: 'Petrov', role: { roleID: '111', roleName: 'admin', }, }, user: { firstName: 'Vlad', lastN

例如,我们有obj

const obj {

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

}
我需要搜索和显示数据。我创建了这个过滤器,其中“数据”-其对象,“参数”-其搜索/过滤输入值

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)
    });
};
但是这个助手不能正常工作。当我输入管理员或版主。它什么也不返回

我不知道,也许我应该用forEach


请帮助我

我假设数据是一个类似于obj的对象,那么数据[0]是未定义的,因为数据是一个对象,而不是数组


如果obj是一个对象,那么user作为对象键是重复的,假设您有一个递归函数来检查用户对象值是否满足输入

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;
}
然后,您可以筛选您的用户:

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

你能提供更多细节吗?还是不明白你的需要