Проверьте, присутствуют ли элементы из одного массива в другом массиве - PullRequest
0 голосов
/ 24 ноября 2018

Каков наилучший способ проверить, присутствуют ли элементы из одного массива в другом массиве с использованием JavaScript?

Я придумала два из следующих методов (но ни один из них мне не очень нравится).

Method1

for(let i = 0; i < arr1.length; ++i) {
    for(let j = 0; j < arr2.length; ++j) {
        if(arr1[i] === arr2[j]) {
            arr1[i].isPresentInArr2 = true;
            break;
        }
    }
}

Method2

const idToObj = {};
for(let i = 0; i < arr2.length; ++i) {
    nameToObj[arr2[i].Id] = arr2[i];
}
for(let i = 0; i < arr1.length; ++i) {
    if(nameToObj[arr1[i].Id]) {
        nameToObj[arr1[i].Id].isPresentInArr2 = true;
    }
}

Здесь я предполагаю, что у меня есть два массива объектов:arr1 и arr2.Эти объекты имеют уникальное свойство Id каждый.И я должен проверить, присутствует ли каждый объект в arr1 в arr2.

Я полагаю, что второй метод будет более эффективным.Надеюсь на интересные предложения.

Ответы [ 4 ]

0 голосов
/ 24 ноября 2018

map над массивами объектов для создания массивов идентификаторов, затем используйте every и includes, чтобы проверить элементы в одноммассив против элементов другого: ids1.every(el => ids2.includes(el)).

Вот рабочий пример:

const arr1 = [{ id: 0 }, { id: 1 }, { id: 2 }];
const arr2 = [{ id: 0 }, { id: 1 }, { id: 2 }];
const arr3 = [{ id: 14 }, { id: 1 }, { id: 2 }];

const getIds = (arr) => arr.map(el => el.id)

function check(arr1, arr2) {
  const ids1 = getIds(arr1);
  const ids2 = getIds(arr2);
  return ids1.every(el => ids2.includes(el));
}

console.log(check(arr1, arr2));
console.log(check(arr1, arr3));
0 голосов
/ 24 ноября 2018

Вы можете получить список идентификаторов, затем отсортировать идентификаторы и сравнить два списка идентификаторов массива, используя JSON.stringify

// Test arrays to work with
const array1 = [{Id:10},{Id:11},{Id:13},{Id:12}]
const array2 = [{Id:10},{Id:11},{Id:12},{Id:13}]
const array3 = [{Id:10},{Id:11},{Id:12}]

function test(arr1, arr2) {
  // Map of each array [0, 1, 2, etc...]
  let map1 = arr1.map(i => i.Id)
  let map2 = arr2.map(i => i.Id)

  // Sort each array from lowest to highest
  // Note: Some kind of sort is required if we are going to compare JSON values
  map1.sort()
  map2.sort()

  // Test the mapped arrays against each other
  return JSON.stringify(map1) === JSON.stringify(map2)
}

console.log(test(array1, array2))
console.log(test(array1, array3))
0 голосов
/ 24 ноября 2018

Вы можете отсортировать массивы, а затем проверить, равны ли они друг другу:

var array1 = [4, 304, 2032], // Some random array
  array2 = [4, 2032, 304];

function areEqual(array1, array2) {
  if (array1.sort().toString() == array2.sort().toString()) {
    // They're equal!
    document.getElementById("isEqual").innerHTML = ("Arrays are equal");
    return true;
  } else {
    // They're not equal.
    document.getElementById("isEqual").innerHTML = ("Arrays aren't equal");
    return false;
  }
}
areEqual(array1, array2);
<!DOCTYPE html>
<html>

<body>
  <p id="isEqual"></p>
</body>

</html>
0 голосов
/ 24 ноября 2018

с точки зрения сложности алгоритма, это как компромиссы.Первый - Сложность пространства-времени - 0, Сложность времени выполнения - 0 (n2)

Второй - Сложность пространства-времени - o (n), Сложность времени выполнения - 0 (n)

Еслиэто сфокусировано на производительности, перейдите ко второму.

С точки зрения js, у вас есть много способов.Прочитайте о встроенных методах include () и indexOf () в javascript, чтобы избежать написания цикла.Также используйте функцию карты JavaScript.Вы также можете использовать underscore.js

Ref Проверьте, содержит ли массив какой-либо элемент другого массива в JavaScript для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...