Проверьте, содержит ли массив javascript все элементы или часть значений элементов другого массива - PullRequest
0 голосов
/ 20 декабря 2018

Я ищу решение следующей проблемы:

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 голосов
/ 20 декабря 2018

Это работает с регулярным выражением, а не с равенством строк, но оно совпадает со стрелкой в ​​любом месте стога сена, поэтому оно возвращает значение 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;
}
0 голосов
/ 20 декабря 2018

Вы можете использовать every с includes для проверки всех деталей:

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));
0 голосов
/ 20 декабря 2018

Вы можете использовать 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
0 голосов
/ 20 декабря 2018

Вы можете проверить иголки на стоге сена с помощью 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
0 голосов
/ 20 декабря 2018

просто небольшая модификация функции ....

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

вместо этого просто проверяет, "нет ли какого-либо элемента в стоге сена, содержащего neddle, верните false"

обратите внимание, чтоэто чувствительно к регистру.

...