簡體   English   中英

如何檢查對象屬性是否包含指定數組中的所有值?

[英]How do I check if an object property contains all values from a specified array?

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

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

我有一個包含所有可用設備的對象(健身房)。

我還有一個數組( equipmentNeeded ),其中包含我需要健身房的所有設備,因此我知道我是否應該去。

如果變量是單個單詞字符串(即我只選擇一個設備),我可以讓它工作,但是如果我有多個值要比較,我就會被困住。

這是我目前所在的位置:

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中的每個元素,並且對於每個元素(我在filter函數中將其命名為gym )它檢查equimentNeeded每個元素是否(使用every()它只是檢查數組中的所有元素是否通過了測試通過提供的函數)存在於gym (<-迭代中的當前元素)。

  • 最后,整個代碼將返回一個filteredGym數組,該數組只包含適合或符合您要求的健身房。

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

    上面的語句只返回一個布爾值,指定gyms數組的當前對象是否擁有所有的equipmentNeeded 如果布爾值為真,則當前對象包含在filteredGyms ,否則將被過濾掉。


我建議你避免在 JS 中使用直接for-loops ,除非它完全需要(它沒有什么不好,但最好使用 JS 提供的其他內置方法,如mapfilterreduce等,這將獲得大部分任務完成)。

將您的代碼修改為:

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

您可以使用這樣的函數來檢查某些字符串的數組是否包含所有其他字符串:

function checkEquipment(itemsOwned, itemsNeeded) {
    for(let itemNeeded of itemsNeeded) {
        if(!itemsOwned.includes(itemNeeded)) {
            return false;   
        }
    }
    return true;
}

現在您可以遍歷所有健身房以檢查其中一些是否適合您:

 const gyms = [{ "name": "gym1", "equipment": ["nothing"] }, { "name": "gym2", "equipment": ["barbell", "kettlebell"] }, { "name": "gym3", "equipment": ["barbell", "dumbbell", "jump rope"] } ] const equipmentNeeded = ["barbell", "jump rope"]; function checkEquipment(itemsOwned, itemsNeeded) { for (let itemNeeded of itemsNeeded) { if (!itemsOwned.includes(itemNeeded)) { return false; } } return true; } for (let gym of gyms) { if (checkEquipment(gym.equipment, equipmentNeeded)) { console.log(gym.name + " has all needed equipment") } else { console.log(gym.name + " 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"]; gyms.forEach(gym => { if (equipmentNeeded.every(i => gym.equipment.includes(i))) { console.log(gym.name + " has all needed equipment"); } else { console.log(gym.name + " doesn't have needed equipment"); } });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM