所以,我正在使用Jquery,并且有两个数组都有多个值,我想检查 all 第一个数组中的值是否存在于第二个数组中。
例如,示例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
到目前为止,我试图通过以下方式解决这个问题:
任何人都可以投入任何光线都会很棒。
答案 0 :(得分:60)
原生JavaScript解决方案
var success = array_a.every(function(val) {
return array_b.indexOf(val) !== -1;
});
如果您支持旧浏览器(包括IE8),则需要every
和indexOf
的兼容性补丁。
.every()
。
来自MDN的{li> Compatibility patch .indexOf()
。
完整的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))
答案 1 :(得分:48)
function containsAll(needles, haystack){
for(var i = 0 , len = needles.length; i < len; 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
答案 2 :(得分:14)
我注意到问题是用jQuery来解决这个问题,但是如果其他人不仅限于jQuery,那么使用下划线js就有一个简单的解决方案。
使用下划线js你可以这样做:
_.intersection(ArrayA, ArrayB).length === ArrayA.length;
来自文档:
intersection_.intersection(*阵列) 计算所有数组交集的值列表。结果中的每个值都存在于每个数组中。
_。交叉口([1,2,3],[101,2,1,10],[2,1]); =&GT; [1,2]
Ergo,如果ArrayB中缺少ArrayA中的某个项目,那么交集将比ArrayA短。
答案 3 :(得分:12)
用于测试arr1
中arr2
中所有元素的单行内容...
使用es6:
var containsAll = arr1.every(i => arr2.includes(i));
没有es6:
var containsAll = arr1.every(function (i) { return arr2.includes(i); });
答案 4 :(得分:0)
您可以使用这个简单的功能(根据上面的答案重命名变量以便于阅读):
function contains(haystack, needles) {
return needles.map(function (needle) {
return haystack.indexOf(needle);
}).indexOf(-1) == -1;
}
答案 5 :(得分:0)
试试这个。
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
}
答案 6 :(得分:0)
如果您需要更多了解阵列中哪些项目,可以使用以下方法:
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)
,然后再使用它。
答案 7 :(得分:0)
您可以使用Set
并再次检查所有项目。
const
containsAll = (needles, haystack) =>
needles.every(Set.prototype.has, new Set(haystack));
console.log(containsAll([105, 112, 103], [106, 105, 103, 112]));
答案 8 :(得分:0)
使用数组函数: []。filter 和 []。includes
类似这样的东西:
[34, 78, 89].filter((v) => {
return [78, 67, 34, 99, 56, 89].includes(v);
});
这将返回匹配项的数组
然后我们可以将其与针阵列进行比较
根据功能,它将是:
const contains = (haystack, needles) => {
return haystack.filter((v) => {
return needles.includes(v);
}).length === needles.length;
}
答案 9 :(得分:0)
只是为了好玩,我已经使用Array.prototype.reduce()实现了一些东西:
public static double pv(double rate, double numberOfPeriod, double payment) {
double retval = 0;
boolean t = false;
if (rate == 0) {
retval = -1*((numberOfPeriod*payment));
}
else {
double r1 = rate + 1;
retval =
(( ( 1 - Math.pow(r1, numberOfPeriod) ) / rate ) * (t ? r1 : 1) * payment - 0)
/
Math.pow(r1, numberOfPeriod);
}
return retval;
}