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

Check if a javascript array contains all elements or part of element values of another array

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

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

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

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

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;
}

只是检查是否 "there is not some item in the haystack that contains the neddle, return false"

注意区分大小写。

您可以使用 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

你可以用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

您可以使用 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));

这适用于匹配正则表达式而不是字符串相等,但它匹配大海捞针中的任何地方,所以它 returns 对于你的第二个例子是正确的,因为找到了苹果和香蕉。

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;
}