сравнить один массив с другим, чтобы убедиться, что второй не содержит другого значения - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу сравнить один массив с другим:

array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'michael', 'bob'];

Я хочу определить, содержит ли массив2 имя, которое не найдено в массиве 1.

массив2 может быть длиннее или корочечем массив1, другими словами, массив2 может иметь пропущенные имена или иметь больше имен, чем массив1, но массив2 не может иметь РАЗНОЕ имя по сравнению с массивом 1.

До сих пор я могу определить, является ли массив2 длиннее массива 1Если это так, то, очевидно, он добавляет имена и поэтому недопустим:

if (array1.length < array2.length) {
      console.log('no');
}

, но это не так точно, как должно быть (если оба массива имеют одинаковое количество значений, этовозвращает true, даже если отдельные значения не коррелируют).

см. следующие примеры сценариев:

array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'b', 'paul']; //should not be valid

array1 = ['billy', 'b', 'paul'];
array2 = ['billy', 'bob', 'paul']; //should not be valid

array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'michael', 'paul']; //should not be valid


array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'bob', 'paul', 'michael']; //should not be valid


array1 = ['billy', 'bob', 'paul'];
array2 = ['billy', 'bob']; //this is valid


array1 = ['billy', 'bob', 'paul'];
array2 = ['billy']; //this is valid

array1 = ['bob', 'bob', 'billy', 'paul'];
array2 = ['paul', 'bob', 'bob', 'bob']; //this IS NOT valid

array1 = ['bob', 'bob', 'billy', 'paul'];
array2 = ['paul', 'bob', 'bob']; //this is valid

Я предполагаю, что должен использовать .every (), но янеуверен в том, как реализовать это при сравнении двух массивов, так как во всех примерах я нахожу тестовые значения одного массива против одного значения.

update: массив 2 не может иметь больше экземпляров определенного имени, чем массив 1,но его может быть меньше.

Ответы [ 4 ]

0 голосов
/ 27 февраля 2019

Вы можете выполнить задачу с помощью простого цикла for и .includes ()

Пример ниже:

var array1 = ['billy', 'michael', 'paul'];
var array2 = ['billy', 'michael', 'bob'];

var check = true;
for(var i = 0; i < array2.length; i++){
	if(!array1.includes(array2[i])){
		check = false;
		break;
	}
}
console.log(check);
0 голосов
/ 27 февраля 2019

Этот подход использует функцию some для остановки, когда хотя бы одно имя не входит в array1, а сумма имен в массивах не одинакова.

let isValid = (arr, arr2) => {
  let sum = (array, n) => array.reduce((a, an) => a + (an === n), 0);  
  return !arr2.some(n => {
    let sum2 = sum(arr2, n);
    return !arr.some(an => an === n && sum(arr, an) === sum2);
  });
};

console.log(isValid(['billy', 'bob', 'paul'], ['billy', 'b', 'paul'])); //should not be valid
console.log(isValid(['billy', 'b', 'paul'], ['billy', 'bob', 'paul'])); //should not be valid
console.log(isValid(['billy', 'bob', 'paul'],['billy', 'michael', 'paul'])); //should not be valid
console.log(isValid(['billy', 'bob', 'paul'], ['billy', 'bob', 'paul', 'michael'])); //should not be valid
console.log(isValid(['billy', 'bob', 'paul'], ['billy', 'bob'])); //this is valid
console.log(isValid(['billy', 'bob', 'paul'], ['billy'])); //this is valid
console.log(isValid(['bob', 'bob', 'billy', 'paul'], ['paul', 'bob', 'bob', 'bob'])); //this is NOT valid
console.log(isValid(['bob', 'bob', 'billy', 'paul'], ['paul', 'bob', 'bob'])); //this is valid
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 27 февраля 2019

Если вам нужно простое и понятное решение, вам не нужно использовать каждое.Просто используйте приведенный ниже код.

В приведенном ниже коде используется цикл .forEach() для цикла array2 и используется другой цикл .forEach() для выясненияесли значение в array2 также указано в array1.

Примечание: Существует много более эффективных методов, но этот метод легче понять, если вы новичок в программировании ихочу понять как это делается.

Редактировать: Как вы предложили в комментариях, я исправил свой код, так что каждое значение в array2 имеет только один аналог в array1.Не каждый раз, когда он совпадает со значением из array2 и array1, он удаляет значение из array1.

var array1 = ['bob', 'bob', 'billy', 'paul'];
var array2 = ['bob', 'bob', 'bob', 'billy'];
var contains = false;
var output = true;

array2.forEach(e2 => {
  contains = false;
  array1.forEach(e1 => {
    if (e2 == e1) {
      contains = true;
      array1.splice(array1.indexOf(e1), 1);
    }
  })
  
  if (!contains) {
    output  = false;
  }
});

console.log(output);
0 голосов
/ 27 февраля 2019

Вы можете использовать every, чтобы проверить, находится ли каждый объект в array2 в array1:

var array1 = ['billy', 'bob', 'paul'];
var array2 = ['billy', 'michael', 'bob'];

var allFound = array2.every(e => array1
.includes(e));

console.log(allFound); //Should return false because 'michael' is not in array1

Это также работает по-другому:

var array1 = ['billy', 'bob', 'paul'];
var array2 = ['billy', 'michael', 'bob'];

var allFound = array1.every(e => array2.includes(e));

console.log(allFound); //Should return false because 'paul' is not in array2

Как предлагается в комментариях, вы также можете сделать array1 (тот, который вы хотите проверить - см. Первый пример) в Set, который похожв массив, но содержит только уникальные значения:

var array1 = ['billy', 'bob', 'paul'];
var array2 = ['billy', 'michael', 'bob'];

var array1Unique = new Set(array1);

var allFound = array2.every(e => array1Unique.has(e));

console.log(allFound); //Should return false because 'michael' is not in array1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...