У меня есть два массива: один заполнен информацией из запроса ajax, а другой хранит кнопки, на которые нажимает пользователь. Я использую этот код (я набрал номера образцов):
var array1 = [2, 4];
var array2 = [4, 2]; //It cames from the user button clicks, so it might be disordered.
array1.sort(); //Sorts both Ajax and user info.
array2.sort();
if (array1==array2) {
doSomething();
}else{
doAnotherThing();
}
Но всегда дает false
, даже если два массива одинаковые, но с разными именами. (Я проверил это в консоли Chrome JS). Итак, есть ли способ узнать, содержат ли эти два массива то же самое? Почему это дает false
? Как узнать, каких значений в первом массиве нет во втором?
javascript
arrays
compare
Карлос Прециозо
источник
источник
Ответы:
Обратите внимание, что это не изменяет исходные массивы, в отличие от предыдущего ответа.
источник
Если элементы вашего массива не являются объектами - например, если они являются числами или строками, вы можете сравнить их соединенные строки, чтобы увидеть, имеют ли они одинаковые элементы в любом порядке -
источник
['a', 'b']
и['a,b']
. Я бы рекомендовал эту технику только для небольших одноразовых скриптов.Если вы хотите проверить, имеют ли два массива одинаковые значения (независимо от количества вхождений и порядка каждого значения), вы можете сделать это с помощью lodash :
Коротко, просто и красиво!
источник
xor
в документах с подчеркиванием? Вы думаете об IODash?Может быть?
источник
Почему ваш код не работал
В JavaScript есть примитивные типы данных и непримитивные типы данных.
Для примитивных типов данных
==
и===
проверьте, имеют ли значения по обе стороны от полосок одинаковое значение. Вот почему1 === 1
верно.Для непримитивных типов данных, таких как массивы,
==
и===
проверьте равенство ссылок. То есть они проверяют, являются лиarr1
иarr2
являются одним и тем же объектом. В вашем примере два массива имеют одинаковые объекты в одном порядке, но не эквивалентны.Решения
Два массива
arr1
иarr2
имеют одинаковые члены тогда и только тогда, когда:arr2
вarr1
И
arr1
вarr2
Итак, это поможет (ES2016):
Это второе решение с использованием Underscore ближе к тому, что вы пытались сделать:
Он работает, потому что
isEqual
проверяет «глубокое равенство», что означает, что он смотрит не только на ссылочное равенство и сравнивает значения.Решение вашего третьего вопроса
Вы также спросили, как узнать, какие вещи
arr1
не содержатся вarr2
.Это сделает это (ES2015):
Вы также можете использовать
difference
метод Underscore ::ОБНОВИТЬ
См. Комментарий @ Redu - мое решение для
sameMembers
, но то, что вы, возможно, имеете в виду,sameMembersInOrder
также известно какdeepEquals
.ОБНОВЛЕНИЕ 2
Если вам не важен порядок членов массивов, ES2015 +
Set
может быть лучшей структурой данных, чемArray
. См. Примечания MDN о том, как реализоватьisSuperset
иdifference
использовать опасные исправления для обезьян.источник
sameMembers([1,1,2],[2,1,2]);
должен вернуть false.sameMembers([1,1,2],[2,1,2])
должен вернутьсяtrue
, на мой взгляд.sameMembersInOrder([1,1,2],[2,1,2])
AKAdeepEquals([1,1,2],[2,1,2])
должен вернутьсяfalse
.arr1.filter...
будет работать только для проверки того, имеет ли arr2 все элементы arr1 или нет, но не наоборот, что также требуется.Проверка равенства объектов:
JSON.stringify(array1.sort()) === JSON.stringify(array2.sort())
Вышеупомянутый тест также работает с массивами объектов, и в этом случае используйте функцию сортировки, как описано в http://www.w3schools.com/jsref/jsref_sort.asp
Может хватить для небольших массивов с плоскими схемами JSON.
источник
Наша цель - проверить, являются ли 2 массива равными множествами. набор - это математически определенный набор . Самая быстрая асимптотическая сортировка занимает O (nlog (n)) времени. Итак, если вы отсортируете массив, это займет как минимум O (nlog (n)) времени. Но вы можете выполнить эту задачу быстрее , что асимптотически занимает время O (n) (средний случай, а не худший случай) со структурой данных словаря. В JS словарь - это просто объект с ключами и значениями.
Обратите внимание , что эта функция работает с массивами примитивных типов и предполагает
a1
иa2
массивы.источник
areArraysEqualSets([1, 2, 2], [1, 2])
areArraysEqualSets([1, 2, 2], [1, 2]) true
Математически они равны.Как насчет этого? ES 2017 я полагаю:
Первое условие проверяет, имеют ли оба массива одинаковую длину, а второе условие проверяет, является ли 1-й массив подмножеством 2-го массива. Объединение этих двух условий должно привести к сравнению всех элементов двух массивов независимо от порядка элементов.
Приведенный выше код будет работать только в том случае, если оба массива не имеют повторяющихся элементов.
источник
Когда вы сравниваете эти два массива, вы сравниваете объекты, представляющие массивы, а не содержимое.
Вам нужно будет использовать функцию для сравнения этих двух. Вы можете написать свой собственный, который просто зацикливается на одном и сравнивает его с другим после того, как вы проверите, что длины одинаковы.
источник
Простое решение для поверхностного равенства с использованием ES6:
Создает мелкие копии каждого массива и сортирует их. Затем используется
some()
для перебораarr1test
значений, сравнивая каждое значение со значениемarr2test
с тем же индексом. Если все значения равны,some()
возвращаетсяfalse
и, в свою очередь,equal
оценивается какtrue
.Можно также использовать
every()
, но ему придется перебирать каждый элемент в массиве, чтобы получитьtrue
результат, тогда как онsome()
откажется, как только найдет значение, которое не равно:источник
У меня были простые целочисленные значения в игровом проекте.
Меньшее количество значений в каждом массиве также нуждалось в том, чтобы исходный массив оставался нетронутым.
Итак, я сделал следующее, все работало нормально. (Код отредактирован для вставки сюда)
Надеюсь, это поможет.
источник
Использование ES6
Мы будем использовать
equals
функцию Ramda , но вместо этого мы можем использовать Lodash или UnderscoreisEqual
:Используя оппонент распространения, мы избегаем мутации исходных массивов и сохраняем нашу функцию чистой.
источник
Вы можете использовать
reduce
вместо циклов, чтобы казаться умным, но рискуете, что ваши коллеги-разработчики будут думать о вас как о умнике.источник
Если элементы в массиве являются примитивами (числами или одиночными символами), вы можете использовать комбинацию сравнения длин и использования наборов.
источник
equalArrayItems([1, 2, 2], [1, 1, 2])
Большинство других решений используют сортировку, O (n * log n), используют библиотеки или имеют сложность O (n ^ 2).
Вот чистое решение Javascript с линейной сложностью O (n):
Тесты:
источник
compareArrays(['1'], [1])
илиcompareArrays([2, 2], [1, 2])
compareArrays([1, 2], [2, 2])
он вернет false, поэтому ваша функция не коммутативна; Что, как мне кажется, неожиданно для такой функции.Если вы используете Prototype Framework, вы можете использовать метод пересечения массива, чтобы узнать, что они одинаковы (независимо от порядка):
источник
[1,2].intersect([1,2,3]).length === [1,2].length
возвращает истину. Вам также следует сравнить длину исходных массивов, для демонстрации я отредактировал сообщение.array1 = [1,1,2]; array2 = [1,1,2];
... исходный ответ не терпит неудачу для этого ввода._.difference(array1, array2).length;
пожалуйста, проверьте этот ответ
источник
return
не повлияет. Во-вторых, вы должны проверить отсортированные массивы, так как[1,2]
и[2,1]
будут определены как не совпадающие. В-третьих, что наиболее важно, это фактически только проверяет, является ли какой-то элемент таким же. Условное должно бытьif (array1!==array2) {return false;}
. Может быть, это поможет тебе в будущем!array1
иarray2
можно было переименовать вelem1
иelem2
. Оба эти совета избавят вас от головной боли в будущем!Отвечаю спустя долгое время, но надеюсь, что это поможет кому-то, кто ищет простое решение и современных новичков.
Теперь мы можем добиться этого с помощью нескольких библиотек, таких как
lodash
,underscore
и т. Д. (В настоящее время они становятся частью проекта из-за простоты, множества функций и высокой степени использования).Вы можете использовать пересечение из библиотеки lodash.
Это будет работать для любого типа данных ..
источник
Если вы хотите сравнить два массива и проверить, совпадает ли какой-либо объект в обоих массивах, он будет работать. Пример :
Array1 = [a, b, c, d]
Array2 = [d, e, f, g]
Здесь 'd' является общим в обоих массивах, поэтому эта функция вернет истинное значение.
источник
Попробуй это
источник
У меня есть другой способ, основанный на принятом ответе.
источник
Функция сравнения двух массивов, чтобы проверить, имеют ли оба одинаковые элементы. Даже если они вышли из строя ...
Это хорошо для простых массивов. [String, Number, Boolean, null, NaN].
Я не использую .sort (), он изменяет исходный массив. Некоторые говорят, что это плохо ...
Осторожно. Эта функция ограничена, она не может сравнивать объекты "[], {}" или функции в этих массивах, массивы сами по себе являются объектами.
источник
Простое решение для сравнения двух массивов:
источник