/
Вопросы и ответы
/
JavaScript
/

Как сравнить два массива в javascript

Как сравнить два массива в javascript

5 лет назад

Человек-Молекула

Ответы

9

Для того чтобы просто сравнить массивы по значениям:

1
2
3
function isArraysEqual(firstArray, secondArray) {
  return firstArray.toString() === secondArray.toString();
}

или:

1
2
3
4
5
6
7
8
9
const areArraysEqual = (firstArray, secondArray) => {
  if (
    firstArray.length === secondArray.length &&
    firstArray.every((element, index) => element === secondArray[index])
  ) {
    return true;
  }
  return false;
};```

3 года назад

Иван Иващенко

6

Прямое сравнение массивов всегда будет давать результат false. Поскольку массив, как объект, указывает на ссылку памяти, где хранится "значение". И эти ссылки всегда будут разными, за исключением случая когда мы сравниваем один и тот же объект (массив).

1
2
3
[1, 2, 3] === [1, 2, 3]; // false
[1, 2, 3] > [1, 2, 3]; // false
[1, 2, 3] < [1, 2, 3]; // false

В последнем случае мы сравниваем один и тот же массив и получаем true, т.к. в b скопировалась ссылку на этот массив, а не значение.

4 года назад

Aleksey

3

Для того чтобы сравнить два массива и получить результат - например список уникальных значений, можно воспользоваться вложенными циклами:

1
2
3
4
5
6
7
8
9
10
11
const arr1 = [1,2,3,6,5];
const arr2 = [1,6,7,8];
const result = [];

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

4 года назад

Вячеслав Межуревский

1
1
2
3
function isEqual(array1, array2) {
  return JSON.stringify(array1) === JSON.stringify(array2);
}

3 года назад

Денис

0

=== и == сравнивают массивы по ссылке. Содержимое они не проверяют:

1
console.log([1, 2] === [1, 2]); // => false

Это два разных объекта в памяти. Содержимое сравнивают поэлементно.

Одинаковые ли массивы

1
2
3
4
5
const isEqual = (a, b) =>
  a.length === b.length && a.every((item, i) => item === b[i]);

console.log(isEqual([1, 2, 3], [1, 2, 3])); // => true
console.log(isEqual([1, 2, 3], [3, 2, 1])); // => false

Функция учитывает порядок и подходит для массивов чисел и строк.

Через JSON.stringify

1
JSON.stringify([1, 2]) === JSON.stringify([1, 2]); // => true

Короче, но с оговорками: undefined и null превратятся в одно и то же null, а у объектов важен порядок ключей. a.toString() === b.toString() ещё хуже: [1, 2] и ['1,2'] дадут одинаковую строку.

Без учёта порядка

1
2
3
4
const sameItems = (a, b) =>
  a.length === b.length && [...a].sort().join() === [...b].sort().join();

console.log(sameItems([3, 1, 2], [1, 2, 3])); // => true

[...a] делает копию: sort() меняет исходный массив.

Массивы объектов

every с === сравнит объекты по ссылке. Для вложенных структур используют готовые функции: isEqual из lodash или assert.deepStrictEqual в тестах Node.js:

1
2
3
import isEqual from 'lodash/isEqual';

isEqual([{ id: 1 }], [{ id: 1 }]); // => true

Чем отличаются массивы

Есть в первом, нет во втором:

1
2
3
4
const a = [1, 2, 3, 4];
const b = [2, 4, 5];

console.log(a.filter((x) => !b.includes(x))); // => [1, 3]

Общие элементы:

1
console.log(a.filter((x) => b.includes(x))); // => [2, 4]

На больших массивах переведите второй массив в Set и проверяйте set.has(x): includes каждый раз проходит массив целиком.

Массивы и их методы разбирают в бесплатном курсе «Основы JavaScript».

2 дня назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845