检查一个javascript数组是否包含另一个数组的所有元素或元素值的一部分

时间:2018-12-20 17:51:49

标签: javascript arrays indexof

我正在寻找以下问题的解决方案:

var haystack_1 = ['banana', 'apple', 'orange'];
var haystack_2 = ['banana', 'apple', 'lemon'];
var haystack_3 = ['banana', 'apple', 'bloodorange'];
var needle_1 = ['apple', 'banana', 'or'];

匹配时的结果应为:

//needle_1 haystack_1 -> true
//needle_1 haystack_2 -> false
//needle_1 haystack_3 -> true

已经为整个单词工作:

function arrayContainsAnotherArray(needle, haystack){
  for(var i = 0; i < needle.length; i++){ 
    if(haystack.indexOf(needle[i]) === -1)
       return false;
  }
  return true;
}

这非常适合完全匹配的内容,例如:

var needle_2 = ['apple', 'banana', 'bloodorange'];
return arrayContainsAnotherArray(needle_2 , haystack_1); //false
return arrayContainsAnotherArray(needle_2 , haystack_2); //false
return arrayContainsAnotherArray(needle_2 , haystack_3); //true

我还如何将此功能与单词的匹配部分结合起来?

5 个答案:

答案 0 :(得分:2)

只是轻微的功能修改。...

function arrayContainsAnotherArray(needle, haystack){
  for(var i = 0; i < needle.length; i++){ 
    if(!haystack.some(hay => hay.indexOf(needle[i]) > -1))
       return false;
  }
  return true;
}

相反,只是检查“干草堆中是否没有包含项的项目,返回false”

请注意,这是区分大小写的。

答案 1 :(得分:0)

您可以将Array#every()Array#some()String#includes()一起使用以进行部分匹配

var haystack_1 = ['banana', 'apple', 'orange'];
var haystack_2 = ['banana', 'apple', 'lemon'];
var haystack_3 = ['banana', 'apple', 'bloodorange'];

function arrayContainsAnotherArray(needle, haystack){
  return haystack.every(s=> needle.some(v => s.includes(v)))
  
}

var needle_2 = ['apple', 'banana', 'bloodorange'];
console.log(arrayContainsAnotherArray(needle_2 , haystack_1)); //false
console.log(arrayContainsAnotherArray(needle_2 , haystack_2)); //false
console.log(arrayContainsAnotherArray(needle_2 , haystack_3)); //true

答案 2 :(得分:0)

您可以用includes再次检查大海捞针。

function check(needle, haystack) {
    return haystack.every(h => needle.some(n => h.includes(n)));
}

var haystack_1 = ['banana', 'apple', 'orange'];
var haystack_2 = ['banana', 'apple', 'lemon'];
var haystack_3 = ['banana', 'apple', 'bloodorange'];
var needle_1 = ['apple', 'banana', 'or'];

console.log(check(needle_1, haystack_1)); // true
console.log(check(needle_1, haystack_2)); // false
console.log(check(needle_1, haystack_3)); // true

答案 3 :(得分:0)

您可以将everyincludes一起使用来检查所有部分:

function arrayContainsAnotherArray(needle, haystack) {
  return needle.every(el => !!haystack.find(item => item.includes(el)));
}

var haystack_1 = ['banana', 'apple', 'orange'];
var haystack_2 = ['banana', 'apple', 'lemon'];
var haystack_3 = ['banana', 'apple', 'bloodorange'];
var needle_1 = ['apple', 'banana', 'or'];

console.log(arrayContainsAnotherArray(needle_1, haystack_1));
console.log(arrayContainsAnotherArray(needle_1, haystack_2));
console.log(arrayContainsAnotherArray(needle_1, haystack_3));

答案 4 :(得分:0)

此方法与regex匹配而不是字符串相等,但在干草堆中的任何地方都与针匹配,因此对于第二个示例它返回true,因为找到了苹果和香蕉。

function needle_matches(haystack, needles) {
  for(var i = 0; i < needles.length; i++){
    if(haystack.some(function(e) { e.match(needles[i]) })) {
      return true;
    }
  }
  return false;
}