首页 > 解决方案 > 如何检查对象属性是否包含指定数组中的所有值?

问题描述

const gyms = [
  {
    "name": "gym1",
    "equipment": ["nothing"]
  },
  {
    "name": "gym2",
    "equipment": ["barbell", "kettlebell"]
  },
  {
    "name": "gym3",
    "equipment": ["barbell","dumbbell","jump rope"]
  }
]

equipmentNeeded = ["barbell","jump rope"]

我有一个包含所有可用设备的对象(健身房)。

我还有一个数组(设备需要),其中包含我在健身房需要的所有设备,所以我知道我是否应该去。

如果变量是单个字符串(即我只选择一个设备),我可以让它工作,但是如果我有多个值要比较,我会坚持下去。

这是我目前所在的位置:

for (i=0;i < gyms.length; i++) {
  if (gyms[i]["equipment"].includes(equipmentNeeded)) {
    console.log(gyms[i]["type"] + " has all needed equipment")
  } else {
    console.log(gyms[i]["type"] + " doesn't have needed equipment")
  }
}

标签: javascript

解决方案


你可以通过以下方式做到这一点 -

工作代码 -

const gyms = [
  {
    "name": "gym1",
    "equipment": ["nothing"]
  },
  {
    "name": "gym2",
    "equipment": ["barbell", "kettlebell"]
  },
  {
    "name": "gym3",
    "equipment": ["barbell","dumbbell","jump rope"]
  }
]

const equipmentNeeded = ["barbell","jump rope"]

const filteredGyms = gyms.filter((gym) => {  
  return equipmentNeeded.every(e => gym.equipment.includes(e));
});

console.log(filteredGyms)

解释

  • 上面的代码只是映射了gyms中的每个元素,并且对于每个元素(我已经将它命名为函数gym中使用filter)它检查内部的每个元素equimentNeeded(使用every()它只是检查数组中的所有元素是否通过提供的函数实现的测试)是出现在gym(<- 迭代中的当前元素) 内。

  • 最后,整个代码将返回一个filteredGym数组,其中仅包含符合或符合您要求的健身房。

  • equipmentNeeded.every(e => gym.equipment.includes(e));
    

    上面的语句只返回一个布尔值,指定gyms数组的当前对象是否具有所有equipmentNeeded. 如果布尔值为真,则包含当前对象,filteredGyms否则将其过滤掉。


我建议你避免for-loops在 JS 中直接使用,除非它完全需要(它没有什么坏处,但最好使用 JS 提供的其他内置方法,如map, filter,reduce等可以完成大部分工作)。


推荐阅读