[英]Check if an array includes an array in javascript
javascript includes
函數可用於查找元素是否存在於數組中。 舉個例子:
var arr = ['hello', 2, 4, [1, 2]]; console.log( arr.includes('hello') ); console.log( arr.includes(2) ); console.log( arr.includes(3) ); console.log( arr.includes([1, 2]) );
將'hello'
或2
傳遞給函數會返回true
,因為兩者都存在於數組arr
中。
將3
傳遞給函數會返回false
,因為它不存在於數組中。
但是,為什么arr.includes([1, 2])
也返回false
,即使這等於數組中的最后一個元素? 如果這種方法不起作用,我還能如何找到我的數組是否包含項目[1, 2]
?
.includes()
方法使用sameValueZero 相等算法來確定一個元素是否存在於數組中。
當被比較的兩個值不是數字時, sameValueZero
算法使用SameValueNonNumber算法。 該算法由 8 個步驟組成,最后一步與您的代碼相關,即在兩個對象之間進行比較時。 這一步是:
- 如果 x 和 y 是相同的 Object 值,則返回 true。 否則,返回假。
因此,對於對象, SameValueZero
算法僅在兩個對象相同時才返回 true 。
在您的代碼中,由於arr
數組中的數組[1, 2]
[1, 2]
與您傳遞給.includes()
方法的 [1, 2] 完全相同,因此.includes()
方法無法在arr
中找到該數組,並且作為結果返回false
。
Array#includes
通過淺比較進行檢查,因此在您的情況下,字符串和數字是原語,它們只有一個實例,因此您可以從Array#includes
中得到true
的結果。
但是當您檢查數組時,您傳遞的是一個新的數組實例,該實例與您檢查的數組中的實例不同,因此淺比較失敗。
要檢查一個數組是否包含在另一個數組中,首先檢查它是否是一個數組,然后在數組之間進行深度比較。
var arr = ['hello', 2, 4, [1, 2]]; const includesArray = (data, arr) => { return data.some(e => Array.isArray(e) && e.every((o, i) => Object.is(arr[i], o))); } console.log(includesArray(arr, [1, 2]));
但是,如果您保留對數組[1, 2]
的引用並使用引用搜索Array#includes
就像在這種情況下一樣,淺層比較可以完美地工作(遵循相同的值零算法):
const child = [1, 2]; const arr = ['hello', 2, 4, child]; console.log(arr.includes(child));
如果您不介意使用lodash ,那么此算法是准確的 - 與公認的答案不同。
import _ from 'lodash';
export const includesArray = (haystack, needle) => {
for (let arr of haystack)
if (_.isEqual(arr, needle)) {
return true
}
return false
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.