簡體   English   中英

比較一個數組與另一個數組以確保第二個數組不包含其他值

[英]compare one array to another to make sure the second doesn't contain a different value

我想將一個數組與另一個數組進行比較:

array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'michael', 'bob'];

我想檢測array2是否包含在array1中找不到的名稱。

array2可以長於或短於array1,換句話說,array2可能缺少名稱或名稱比array1多,但與array1相比,array2不能具有不同的名稱。

到目前為止,我可以檢測到array2是否比數組1長。如果是,則顯然是在添加名稱,因此無效:

if (array1.length < array2.length) {
      console.log('no');
}

但是我並沒有達到所需的精確度(如果兩個數組具有相等數量的值,即使各個值不相關,它也會返回true)。

請參閱以下示例場景:

array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'b', 'paul']; //should not be valid

array1 = ['billy', 'b', 'paul'];
array2 = ['billy', 'bob', 'paul']; //should not be valid

array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'michael', 'paul']; //should not be valid


array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'bob', 'paul', 'michael']; //should not be valid


array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'bob']; //this is valid


array1 = ['billy', 'bob', 'paul'];
array2 = ['billy']; //this is valid

array1 = ['bob', 'bob', 'billy', 'paul'];
array2 = ['paul', 'bob', 'bob', 'bob']; //this IS NOT valid

array1 = ['bob', 'bob', 'billy', 'paul'];
array2 = ['paul', 'bob', 'bob']; //this is valid

我假設我應該使用.every(),但是我不確定在比較兩個數組時如何實現它,因為所有示例我都發現一個數組的測試值與單個值比較。

更新:數組2不能具有比數組1更多的特定名稱實例,但是可以更少。

當至少一個名稱不在array1並且兩個數組之間的名稱之和不同時,這種方法使用some函數停止。

 let isValid = (arr, arr2) => { let sum = (array, n) => array.reduce((a, an) => a + (an === n), 0); return !arr2.some(n => { let sum2 = sum(arr2, n); return !arr.some(an => an === n && sum(arr, an) === sum2); }); }; console.log(isValid(['billy', 'bob', 'paul'], ['billy', 'b', 'paul'])); //should not be valid console.log(isValid(['billy', 'b', 'paul'], ['billy', 'bob', 'paul'])); //should not be valid console.log(isValid(['billy', 'bob', 'paul'],['billy', 'michael', 'paul'])); //should not be valid console.log(isValid(['billy', 'bob', 'paul'], ['billy', 'bob', 'paul', 'michael'])); //should not be valid console.log(isValid(['billy', 'bob', 'paul'], ['billy', 'bob'])); //this is valid console.log(isValid(['billy', 'bob', 'paul'], ['billy'])); //this is valid console.log(isValid(['bob', 'bob', 'billy', 'paul'], ['paul', 'bob', 'bob', 'bob'])); //this is NOT valid console.log(isValid(['bob', 'bob', 'billy', 'paul'], ['paul', 'bob', 'bob'])); //this is valid 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

您可以使用every檢查array2中的每個對象是否在array1

 var array1 = ['billy', 'bob', 'paul']; var array2 = ['billy', 'michael', 'bob']; var allFound = array2.every(e => array1 .includes(e)); console.log(allFound); //Should return false because 'michael' is not in array1 

這也可以用另一種方式工作:

 var array1 = ['billy', 'bob', 'paul']; var array2 = ['billy', 'michael', 'bob']; var allFound = array1.every(e => array2.includes(e)); console.log(allFound); //Should return false because 'paul' is not in array2 

如注釋中所建議,您還可以將array1 (要檢查的對象-請參見第一個示例) SetSet ,它類似於數組,但僅包含唯一值:

 var array1 = ['billy', 'bob', 'paul']; var array2 = ['billy', 'michael', 'bob']; var array1Unique = new Set(array1); var allFound = array2.every(e => array1Unique.has(e)); console.log(allFound); //Should return false because 'michael' is not in array1 

如果您想要一個簡單易懂的解決方案,則無需使用每一個。 只需使用下面的代碼。

下面的代碼使用.forEach()循環遍歷array2並使用另一個.forEach()循環找出array2的值是否也在array1

注意:有許多更有效的方法,但是如果您不熟悉編程並且想了解如何完成此方法,則更易於理解。

編輯:正如您在注釋中建議的那樣,我修復了我的代碼,因此array2每個值在array1只有一個對應項。 並非每次它與array2array1中的值匹配時,都會從array1刪除該值。

 var array1 = ['bob', 'bob', 'billy', 'paul']; var array2 = ['bob', 'bob', 'bob', 'billy']; var contains = false; var output = true; array2.forEach(e2 => { contains = false; array1.forEach(e1 => { if (e2 == e1) { contains = true; array1.splice(array1.indexOf(e1), 1); } }) if (!contains) { output = false; } }); console.log(output); 

您可以使用簡單的for循環和.includes()完成任務

下面的例子:

 var array1 = ['billy', 'michael', 'paul']; var array2 = ['billy', 'michael', 'bob']; var check = true; for(var i = 0; i < array2.length; i++){ if(!array1.includes(array2[i])){ check = false; break; } } console.log(check); 

暫無
暫無

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

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