Лучший способ проверить, равны ли значения двух массивов в JavaScript - PullRequest
0 голосов
/ 23 июня 2019

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

Эти значения являются просто первичными ключами объектов базы данных, поэтому они всегда будут разными

const result = [1, 3, 8, 77]
const same = [8, 3, 1, 77]
const diff = [8, 3, 5, 77]

areValuesTheSame(result, same) // true
areValuesTheSame(result, diff) // false

Как должен выглядеть areValuesTheSame метод?

P.S. Этот вопрос выглядит как дубликат, но я не нашел ничего относительно Javascript.

Ответы [ 3 ]

3 голосов
/ 23 июня 2019

Я делаю следующие предположения:

  • Массивы содержат только цифры.
  • Вам не важен порядок элементов; перестановка массивов в порядке.

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

function areValuesTheSame(a, b) {
    return a.sort().join(' ') === b.sort().join(' ');
}

const result = [1, 3, 8, 77];
const same = [8, 3, 1, 77];
const diff = [8, 3, 5, 77];

console.log(areValuesTheSame(result, same));
console.log(areValuesTheSame(result, diff));

Это, наверное, самый ленивый / самый короткий подход.

2 голосов
/ 23 июня 2019

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

function haveSameValues(a, b) {
    const count = d => (m, v) => m.set(v, (m.get(v) || 0) + d)
    return Array
        .from(b.reduce(count(-1), a.reduce(count(1), new Map)).values())
        .every(v => v === 0);
}

const result = [1, 3, 8, 77]
const same = [8, 3, 1, 77]
const diff = [8, 3, 5, 77]

console.log(haveSameValues(result, same)); // true
console.log(haveSameValues(result, diff)); // false
1 голос
/ 23 июня 2019

Попробуйте это:

const result = [1, 3, 8, 77]
const same = [8, 3, 1, 77]
const diff = [8, 3, 5, 77]
const areValuesTheSame = (a,b) => (a.length === b.length) && Object.keys(a.sort()).every(i=>a[i] === b.sort()[i])


console.log(areValuesTheSame(result, same)) // true
console.log(areValuesTheSame(result, diff)) // false
...