簡體   English   中英

檢查數組是否包含javascript中的數組

[英]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 個步驟組成,最后一步與您的代碼相關,即在兩個對象之間進行比較時。 這一步是:

  1. 如果 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.

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