首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有任何方法从对象数组中筛选对象,这些对象数组应包括javascript中所有选定的值。

是否有任何方法从对象数组中筛选对象,这些对象数组应包括javascript中所有选定的值。
EN

Stack Overflow用户
提问于 2022-09-02 16:30:51
回答 2查看 41关注 0票数 0

在这里,我有技能数组和员工数组,我试图获得员工,包括技能数组中包含的所有技能,使用减少、筛选或查找方法。我正试图将过滤过的员工存储在filteredItems中,但被卡在里面了。

代码语言:javascript
复制
filteredItems = Skills?.length>0   ?             
Employees?.filter((item) => {
return     item.Skills.find((ele) => {
                  return Skills.find((el) => {
                    if(el.value === ele.id){
                       return ele
                    }
                  })
            })
          }) : []

下面是所提到的数组。

技能阵列

代码语言:javascript
复制
[
{
    "value": 6,
    "label": "Marketing"
},
{
    "value": 20,
    "label": "Golang"
}
]

员工阵列

代码语言:javascript
复制
[
{
    "name": "Hassan",
    "id": 56,
    "Skills": [
        {
            "id": 20,
            "name": "Golang",
        },
    ],
},
 {
    "name": "Haroon",
    "id": 95,
    "Skills": [
        {
            "id": 6,
            "name": "Marketing",
        },
        {
            "id": 20,
            "name": "Golang",
        },
    ],
},
]

例如,在上面的数组场景中,它应该返回id为95的雇员,而不是id 56的雇员,因为它包含技能,但不是技能数组中提到的所有技能。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-02 16:51:28

我发现,首先封装要搜索的技能ID数组比较容易。

代码语言:javascript
复制
let skillIds = Skills.map(s => s.value);

然后,我过滤并将最终结果与技能Ids数组的长度进行比较:

代码语言:javascript
复制
let filteredItems = Skills?.length > 0 ?
  Employees?.filter(item => item.Skills.filter( s =>
      skillIds.includes(s.id)).length==skillIds.length): []

代码语言:javascript
复制
let Skills = [{
  "value": 6,
  "label": "Marketing"
}, {
  "value": 20,
  "label": "Golang"
}]
let Employees = [{
  "name": "Hassan",
  "id": 56,
  "Skills": [{
    "id": 20,
    "name": "Golang",
  }],
}, {
  "name": "Haroon",
  "id": 95,
  "Skills": [{
      "id": 6,
      "name": "Marketing",
    },
    {
      "id": 20,
      "name": "Golang",
    },
  ],
}, ]

let skillIds = Skills.map(s => s.value);

let filteredItems = Skills?.length > 0 ?
  Employees?.filter(item => item.Skills.filter( s => skillIds.includes(s.id)).length==skillIds.length): []

console.log(filteredItems)

票数 0
EN

Stack Overflow用户

发布于 2022-09-02 16:51:02

您可以在employees数组中创建另一个属性。叫它"QUalified“。默认为true,然后当员工在技能数组中没有技能时,将其设置为false。

代码语言:javascript
复制
let arSkills = [
{
    "value": 6,
    "label": "Marketing"
},
{
    "value": 20,
    "label": "Golang"
}
];

let arEmp = [
{
    "name": "Hassan",
    "id": 56,
    "Skills": [
        {
            "id": 20,
            "name": "Golang",
        },
    ],
},
 {
    "name": "Haroon",
    "id": 95,
    "Skills": [
        {
            "id": 6,
            "name": "Marketing",
        },
        {
            "id": 20,
            "name": "Golang",
        },
    ],
},
];

arEmp.forEach(ele =>{
    ele.Qualified = true;
  let arTmp = [];
  
  for(let {id} of ele.Skills)
    arTmp.push(id)
  
  for(let {value} of arSkills)
    if(!arTmp.includes(value))
        ele.Qualified = false
});

let arQual = arEmp.filter((ele) =>{
    return ele.Qualified
});

console.log(arQual);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73585585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档