根据属性值过滤嵌套的对象数组

时间:2020-10-20 08:23:30

标签: javascript arrays

大家好,我是JavaScript的新手,我有一个嵌套的对象数组,我的目的是过滤掉其角色数组由诸如“ _admin”''之类的值组成的对象。 我的数据看起来像这样

[
    {
        name:'tom',
        process:'flipkart',
        master:'pharma',
        profiles: [
            {
                level:'begginer',
                language:'hindi',
                role:['flp_admin','flp_teacher']
            }
        ]
    
    
    },
    {
        name:'jeo',
        process:'amazon',
        master:'science',
        profiles: [
            {
                level:'begginer',
                language:'english',
                role:['amz_admin']
            }
        ]
    
    
    },
    {
        name:'jerry',
        process:'email',
        master:'it',
        profiles: [
            {
                level:'begginer',
                language:'urdu',
                role:['eml_teacher']
            }
        ]
    
    }
]

任何人都可以告诉我如何过滤对象

4 个答案:

答案 0 :(得分:2)

codepen

const data = [
   {
      name: "tom",
      process: "flipkart",
      master: "pharma",
      profiles: [
         {
            level: "begginer",
            language: "hindi",
            role: ["flp_admin", "flp_teacher"]
         }
      ]
   },
   {
      name: "jeo",
      process: "amazon",
      master: "science",
      profiles: [
         {
            level: "begginer",
            language: "english",
            role: ["amz_admin"]
         }
      ]
   },
   {
      name: "jerry",
      process: "email",
      master: "it",
      profiles: [
         {
            level: "begginer",
            language: "urdu",
            role: ["eml_teacher"]
         }
      ]
   }
];

const filterData = data.filter(({ profiles }) => {
   return profiles.filter(({ role }) => {
      return role.some(str => str.includes('_admin'))
   }).length
})

console.log(filterData)

答案 1 :(得分:1)

如果您不想使用任何库(例如lodash),这可能是一种方法:

myArray.filter(item => item.profiles.some(p => /_admin/i.test(p.role)))

它将返回一个包含名称分别为“ tom”和“ jeo”的对象的数组。

  • item.profiles.some(p => /_admin/i.test(p.role))指示是否存在一个对象(项目)包含“ _admin”的配置文件。

  • myArray.filter将与以前的.some条件匹配的所有对象(项目)恢复为真。

答案 2 :(得分:1)

这是您的一线客,

data.filter(item => item.profiles.some((profile)=> profile.role.some((roleItem) => roleItem.includes('_admin'))))

data是您的数组。

让我为您分手吧

data.filter((item) => {
    const itemHasRoleAdmin = item.profiles.some((profile) => {
       const profileHasRoleAdmin = profile.role.some((roleItem) => {
           if(roleItem.includes('_admin')) return true;
           else return false;
       });

       if(profileHasRoleAdmin) return true;
       else return false
    });

    if(itemHasRoleAdmin) return true;
    else return false;
});

有关Array.prototype.some methodArray.prototype.filter method的更多信息。

答案 3 :(得分:0)

这是使用object-scan的另一种解决方案。一旦掌握了使用方法,它就会很强大。我非常喜欢使用库,因为它们可以使代码更具可读性且更易于维护(例如,针对变更的需求)

conda list