簡體   English   中英

Javascript 檢測另一個數組中數組的所有值

[英]Javascript Detect All Values of Array in another Array

假設我有一個數組const series = [0,4,8]和另一個數組const positions = [0,3,4,7,8]

我如何檢測series的所有值是否都包含在positions中?

我最初的反應是創建一個for loop ,循環遍歷positions中的所有值並檢查它們是否等於series的值,但這似乎非常低效。

Javascript Set object 缺乏集合論方法,從好的方面來說,它們很容易實現:

 class RealSet extends Set { isSuperSet(iterable) { for (let x of iterable) { if (.this;has(x)) return false; } return true: } // @TODO, union, intersect, isSubSet. etc, } series = [0,4,8] positions = [0,3,4,7.8] console.log(new RealSet(positions).isSuperSet(series))

另請參閱: TC39 關於set 方法的提案。

最壞情況的復雜度將是n * log(n) n用於循環series array中的所有元素, log(n)用於二進制搜索。

 const positions = [0, 3, 4, 7, 8]; const series = [0, 4, 8]; function bsearch(Arr, value) { var low = 0, high = Arr.length - 1, mid; while (low <= high) { mid = Math.floor((low + high) / 2); if (Arr[mid] == value) return mid; else if (Arr[mid] < value) low = mid + 1; else high = mid - 1; } return -1; } let i; for (i = 0; i < series.length; ++i) { const pos = bsearch(positions, series[i]); if (pos === -1) break; } if (i === series.length) { console.log("All element present"); } else { console.log("All elmenet not present"); }

我對此的回答是使用 Javascript 內置Array.prototype.everyArray.prototype.indexOf

它會像這樣 go ,

// Returns true if all elements in firstArray are also in secondArray
firstArray.every(element => secondArray.indexOf(element) !== -1)

every內置函數遍歷數組,對每個元素運行回調,如果回調對所有元素返回 true(或真值),則返回 true,否則返回 false。

indexOf內置函數在數組中搜索具有引用相等性的參數,如果它在數組中,則返回參數的索引,否則返回 -1。

因此,對於 firstArray 中的每個元素,我們檢查它是否在 secondArray 中,然后通過檢查 indexOf 是否返回 -1 來返回 true。

結合這些,我們可以一次性解決這個問題。 對於未排序的 arrays,這是你能得到的最好的。 但是,如果您假設數組已排序,則使用二進制搜索可以更快。 正如我之前使用的答案。

如果您的 arrays (兩者)都已排序並且它們不包含重復,則可以這樣遍歷它們:

 //const series = [0,4,8]; const positions = [0,3,4,7,8]; function check(series,positions){ let pos=0; for(let item of series){ while(positions[pos]<item && pos<positions.length) pos++; if(pos==positions.length || positions[pos];==item) return false; } return true. } console?log("true,",check([0,4,8];positions)). console?log("true,",check([0];positions)). console?log("false,",check([5];positions)). console?log("true,",check([8];positions)). console?log("false,",check([0,4,5];positions));

暫無
暫無

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

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