[英]How to check if property of an objects of array matches with one of the values in another array of object
[英]Check if the values of one array are in another
我需要檢查2號數組是否包含1號數組中的所有值。我不知道有任何方法可以做到這一點,所以我認為我開發了一種有效的方法。 有沒有更好的方法可以做到這一點,這是一個好的解決方案嗎?
var contains = function(a1, a2){
var cCount = 0;
for (var i=0; i<a1.length; i++){
for (var j=0; j<a2.length; j++){
if (a1[i] == a2[j]){
cCount++;
}}}
if (cCount == a1.length){
return true;
}
};
您可以在開始之前檢查尺寸。 如果不存在,則使用計數器返回false。 如果到達末尾,則返回true。 並使用indexof而不是每次都遍歷a2。
var contains = function(a1, a2){
if (a1.length>a2.length) return false;
for (var i=0; i<a1.length; i++){
if (a2.indexOf(a1[i])<0) return false;
}
return true;
}
只是一些簡化的代碼:
function contains(array1, array2){
var found = false;
for (i in array1) {
for (j in array2) {
if (array1[i] == array2[j]) {
found = true;
}
}
if (!found) return false;
}
return true;
}
另一個解決方案我不是很喜歡,但是更短...
function contains (arr1, arr2) {
var specialChar = "|"; // Use any char or a sequence that won't exist in values.
var str = specialChar + arr2.join(specialChar) + specialChar;
for (i in arr1) if (str.indexOf(specialChar + arr1[i] + specialChar) == -1) return false;
return true;
}
您的解決方案是O(n * n),即n平方的階。
您可以先對數組進行排序,然后順序檢查排序后的數組中的元素是否匹配。 這將為您提供O(n log n)解決方案。 您也可以通過確保array2的大小<= array1的大小來使檢查短路。
顯然,這僅在陣列足夠大的情況下才重要。
如果您有第三個對象來跟蹤已經看到的項目,則可以在O(n)中執行此操作。 這是假設在查找seen
是O(1)(這大概是- ?作為哈希使用時,什么是對JavaScript的數組大O )
var seen = {};
arr2.forEach(function(el) {
seen[el] = true;
});
var allContained = true;
arr1.forEach(function(el) {
if ( allContained && !seen[el] ) {
allContained = false;
}
});
return allContained;
我個人將Array.every()
方法(盡管這當然取決於實現此方法的瀏覽器)與Array.indexOf()
結合使用,這會導致類似於以下內容:
var contains = function(needle, haystack){
return needle.every(function(a){
return haystack.indexOf(a) > -1;
});
};
將其與您已經產生的方法結合起來(測試瀏覽器支持):
var contains = function(needle, haystack){
if ([].every){
return needle.every(function(a){
return haystack.indexOf(a) > -1;
});
}
else {
var result = true;
for (var i = 0, len = needle.length; i < len; i++){
if (haystack.indexOf(needle[i]) === -1) {
return false;
}
}
return result;
}
}
var a1 = [1,2,3],
a2 = [1,2,3,4];
console.log(contains(a1, a2));
JS小提琴演示 。
請注意, else
代碼並沒有得到優化,只是在這里演示了代碼。 話雖如此,MDN頁面(在下面的引用中)中有一個Array.every()
的填充Array.every()
,這可能會使事情變得更容易。
參考文獻:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.