[英]How to check whether multiple values exist within an Javascript array
所以,我正在使用 Jquery 並且有兩個數組都有多個值,我想檢查第一個數組中的所有值是否存在於第二個數組中。
例如,示例 1...
數組 A 包含以下值
34, 78, 89
數組 B 包含以下值
78, 67, 34, 99, 56, 89
這將返回true
...示例 2:
數組 A 包含以下值
34, 78, 89
數組 B 包含以下值
78, 67, 99, 56, 89
這將返回false
...示例 3:
數組 A 包含以下值
34, 78, 89
數組 B 包含以下值
78, 89
這將返回false
到目前為止,我已嘗試通過以下方式解決此問題:
任何人都可以拋出的任何燈都會很棒。
原生 JavaScript 解決方案
var success = array_a.every(function(val) {
return array_b.indexOf(val) !== -1;
});
你需要的兼容性補丁every
和indexOf
如果你支持舊的瀏覽器,包括IE8。
完整的jQuery解決方案
var success = $.grep(array_a, function(v,i) {
return $.inArray(v, array_b) !== -1;
}).length === array_a.length;
ES2015 解決方案
上面的原生解決方案可以使用 ES2015 的箭頭函數語法及其.includes()
方法來縮短:
let success = array_a.every((val) => array_b.includes(val))
function containsAll(needles, haystack){
for(var i = 0; i < needles.length; i++){
if($.inArray(needles[i], haystack) == -1) return false;
}
return true;
}
containsAll([34, 78, 89], [78, 67, 34, 99, 56, 89]); // true
containsAll([34, 78, 89], [78, 67, 99, 56, 89]); // false
containsAll([34, 78, 89], [78, 89]); // false
用於測試arr1
中的所有元素是否存在於arr2
中的arr2
...
使用es6:
var containsAll = arr1.every(i => arr2.includes(i));
沒有es6:
var containsAll = arr1.every(function (i) { return arr2.includes(i); });
我注意到這個問題是關於用 jQuery 解決這個問題的,但是如果不限於 jQuery 的其他人出現,那么有一個使用下划線 js 的簡單解決方案。
使用下划線 js,您可以執行以下操作:
_.intersection(ArrayA, ArrayB).length === ArrayA.length;
從文檔:
intersection_.intersection(*arrays) 計算作為所有數組交集的值列表。 結果中的每個值都存在於每個數組中。
_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]); => [1, 2]
因此,如果 ArrayA 中的一項在 ArrayB 中丟失,則交集將比 ArrayA 短。
你可以拿一個Set
並再次檢查所有項目。
const containsAll = (needles, haystack) => needles.every(Set.prototype.has, new Set(haystack)); console.log(containsAll([105, 112, 103], [106, 105, 103, 112]));
如果您需要更多地了解數組中的哪些項目,您可以使用這個:
var tools = {
elem : {},
arrayContains : function(needles, arrhaystack) {
if (this.typeOf(needles) === 'array') {
needle.reduce(function(result,item,$i,array){ // You can use any other way right there.
var present = (arrhaystack.indexOf(item) > -1);
Object.defineProperty(tools.elem, item, {
value : present,
writable : true
});
},{})
return this.elem;
}
},
typeOf : function(obj) {
return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}
}
簡單地使用它var check = tools.arrayContains([10,'foo'], [1,'foo','bar'])
然后你會得到這樣的結果
10 : false
foo : true
然后,如果您只需要獲得一個結果(如果其中之一為真),您可以:
arr = Object.values(check);
(arr.indexOf('true')) ? instru1 : instru2 ;
我不認為這是更好的方法,但它有效且易於適應。 考慮到這個例子,我建議你在以你的方式使用它之前制作一個Object.create(tools)
。
使用數組函數: [].filter和[].includes
像這樣的東西:
[34, 78, 89].filter((v) => {
return [78, 67, 34, 99, 56, 89].includes(v);
});
這將返回匹配項的數組
然后我們可以將它與needles數組進行比較
作為一個函數,它將是:
const contains = (haystack, needles) => {
return haystack.filter((v) => {
return needles.includes(v);
}).length === needles.length;
}
只是為了好玩,我用 Array.prototype.reduce() 實現了一些東西:
let areKeysPresent = function (sourceArray, referenceArray) {
return sourceArray.reduce((acc, current) => acc & referenceArray.includes(current), true)
}
你也可以像這樣添加一個 containsAll 到 Array 原型:
Array.prototype.containsAll = function()
{
return Array.from(arguments).every(i => this.includes(i));
}
例子:
["apple", "banana", "strawberry"].containsAll("apple", "banana"); // true
["apple", "banana", "strawberry"].containsAll("apple", "kiwi"); // false
您可以使用這個簡單的函數(按照上面的答案重命名變量以便於閱讀):
function contains(haystack, needles) {
return needles.map(function (needle) {
return haystack.indexOf(needle);
}).indexOf(-1) == -1;
}
試試這個。
var arr1 = [34, 78, 89];
var arr2 = [78, 67, 34, 99, 56, 89];
var containsVal = true;
$.each(arr1, function(i, val){
if(!$.inArray(val, arr2) != -1){
retVal = false;
return false;
}
});
if(containsVal){
//arr2 contains all the values from arr1
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.