javascript - 如何检查对象属性是否包含指定数组中的所有值?
问题描述
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")
}
}
解决方案
你可以通过以下方式做到这一点 -
工作代码 -
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
等可以完成大部分工作)。
推荐阅读
- c - 循环中的 fgets 重复二维数组中的数据
- string - 努力让 Arduino Uno 上的 ESP8266 与 AT 通信可靠地工作
- svg - 如何合并两个svg文件
- python - 如何转换熊猫数据框中所有列的数据类型
- c# - C# Linq EF Core 按组键的子字符串对“结果组”进行排序
- r - 如何在R中的for循环中为列表键分配值
- python - 根据行记录创建分类列
- javascript - ng-select : add an extra option
- c++ - io_context.run() 用于提升野兽服务器
- jquery - Jquery FadeTo 回调未按预期工作