[英]check if an array "includes" an item in Javascript
我試圖理解數組“包含”函數。 我的目標是確定數組是否包含某個項目。 它適用於字符串數組,但是當使用對象時它不起作用。
var itemsString = ["name1", "name2"]; var itemsObject = [{ name: "name1" }, { name: "name2" }]; var itemToSearch = { name: "name1" }; console.log(itemsString.includes("name1" )); console.log(itemsObject.includes(itemToSearch)); console.log(itemsObject.includes(x => x.name === "name1"));
輸出:
“包含”是否適用於對象,還是需要使用其他函數?
在這種情況下,您需要使用Array.prototype.some()
。 Array.prototype.includes()
不接受函數參數*,並且您沒有測試嚴格相等性。
const itemsObject = [{ name: "name1" }, { name: "name2" }]; console.log(itemsObject.some(x => x.name === "name1"));
*來自評論部分的同行壓力迫使我澄清includes()
確實接受函數參數,但不會使用傳遞的函數作為謂詞來確定給定的項目是否匹配。 相反,它會嘗試在數組中查找與傳遞的函數嚴格相等的項。
“包含”是否適用於對象,還是需要使用其他函數?
Includes適用於對象,但它通過引用比較對象。 在你的情況,盡管第一個元素itemsObject
具有相同的密鑰和值itemToSearch
,它們是不同的對象,因此包括將無法工作,因為對於對象的情況下,它看起來對同一個對象實例。
為了使其工作,您可以使用多種替代方法,例如.find
、 .some
、 .filter
。
另一個我個人不推薦但我認為值得一提的解決方案是,如果您首先將項目映射到字符串,則可以使用.includes
。 在這種情況下,使用 JSON.stringify,您可以檢查對象是否相同。 注意:這僅適用於單個關鍵項目。 JSON.stringify 不保留鍵和值的順序,因此它僅適用於單個鍵對象(除非鍵和值在原始字符串化對象中的順序相同)。 此外,JSON.stringify 方式比其他方式更重且性能更低,我認為值得一提的是作為一個例子。
下面是每個示例的一些示例。
var itemsString = ["name1", "name2"]; var itemsObject = [{ name: "name1" }, { name: "name2" }]; var itemToSearch = { name: "name1" }; console.log(itemsObject.some(r => r.name === itemToSearch.name)); console.log(!!itemsObject.find(r => r.name === itemToSearch.name)); // ^--- !! is used to cast to boolean. console.log(itemsObject.filter(r => r.name === itemToSearch.name).length > 0); console.log(itemsObject.map(i => JSON.stringify(i)).includes(JSON.stringify(itemToSearch))); // ^--------------^ ^---------------------------------------^ // |------ this will stringify each object, converting it to a json string. | // | // this will check whether the string[] includes any stringified value.--^
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.