簡體   English   中英

檢查數組是否“包含”Javascript 中的項目

[英]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也適用於對象,但它通過引用比較它們。 在您的情況下,您可能想要.find或檢查.some對象是否與您的查詢匹配。

“包含”是否適用於對象,還是需要使用其他函數?

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.

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