[英]check if an javascript array contains all of the values of another array
[英]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.every
和Array.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.