Мне нужно найти массивы, где все значения равны. Какой самый быстрый способ сделать это? Должен ли я пройти через это и просто сравнить значения?
['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
javascript
jquery
Marvin3
источник
источник
a.join(',').split(a[0]).length === a.length + 1
Ответы:
Или однострочник:
Array.prototype.every (из MDN):
every()
метод проверяет, все ли элементы массива проходят тест, реализованный предоставленной функцией.источник
const everythings_equal = array => array.every(thing => thing === array[0]);
some
вместоevery
:arr.some( v => v !== arr[0] )
. Это вернется рано после того, как первый элемент окажется неравнымarr[0]
.every
тоже рано возвращается.Редактировать: Быть красным ниндзя:
Полученные результаты:
Предупреждение:
Это потому, что мы не передаем начальное значение . Итак, вы можете проверить в
array.length
первую очередь.источник
false
s! например try [false, false, false] .reduce (function (a, b) {return (a === b)? a: false;});["false", ""]
возвращаетсяtrue
: /NaN
. Поскольку обаNaN === NaN
иNaN !== NaN
являются ложными, это гарантирует, что, если для параметраprev
установлено значение NaN, никакое значение не может его убрать. Кроме того, добавление в двойное отрицание преобразует результаты вtrue
иfalse
, посколькуNaN
это ложно. Окончательная форма:!!array.reduce(function(a, b){ return (a === b) ? a : NaN; });
Это работает. Вы создаете метод в Array, используя прототип.
Назовите это так:
источник
Array.prototype
просто отлично (даже IE6). Это только прототипы элементов DOM, которые некоторые старые версии IE не поддерживают расширение.allValuesSame
в циклВ JavaScript 1.6 вы можете использовать
Array.every
:Возможно, вам понадобятся некоторые проверки работоспособности, например, когда массив не имеет элементов. (Кроме того, это не будет работать, когда все элементы
NaN
с тех порNaN !== NaN
, но это не должно быть проблемой ... верно?)источник
Вы можете превратить массив в набор. Если размер набора равен 1, то все элементы массива равны.
источник
allEqual([NaN, NaN])
даетtrue
в этом случае.И для сравнения производительности я также сделал тест:
Полученные результаты:
Таким образом, очевидно, что использование встроенного array.some () является самым быстрым методом из опрошенных.
источник
Array#some
иногда приходится опережать, состоит в том, что как только функция обратного вызова возвращает true, она прекращает итерацию. Таким образом, если все элементы на самом деле равны, производительность должна быть идентичнойArray#every
. И относительная производительность, когда все элементы не равны, будет варьироваться в зависимости от индекса первого несоответствующего элемента.Кратчайший ответ с использованием подчеркивания / lodash
спецификация:
редактировать:
Или даже короче, вдохновленный ответом Тома:
спецификация:
источник
Если вы уже используете underscore.js , то вот еще один вариант использования
_.uniq
:_.uniq
возвращает версию массива без дубликатов. Если все значения одинаковы, то длина будет 1.Как упоминалось в комментариях, учитывая, что вы можете ожидать возврата пустого массива
true
, вам также следует проверить этот случай:источник
false
. Пока думаю так и должно бытьtrue
. Переход на.length <= 1
должно быть достаточно, хотя.Да, вы можете проверить это также с помощью фильтра, как показано ниже, очень просто, проверяя, что все значения совпадают с первым:
также может быть сделано с использованием каждого метода в массиве:
и вы можете проверить свои массивы, как показано ниже:
Или вы можете добавить его к собственным функциям Array в JavaScript, если вы многократно его используете:
и вы можете проверить свои массивы, как показано ниже:
источник
Вы можете использовать,
Array.every
если поддерживается:Альтернативный подход цикла может быть что-то вроде
sort
Или, если элементы похожи на вопрос, что-то грязное, как:
Также работает.
источник
equals = !array.some( (v,i,a) => v!==a[0] )
. В противном случае вы просто проверяете, что любое значение равно первому, что, конечно, всегда будет верным :)some
вместо того,every
что я упоминал в первом абзаце. :) Спасибо за улов!Вы можете заставить этот однострочник делать то, что вы хотите, используя функции стрелок Array.prototype.every , Object.is и ES6:
источник
Я думаю, что самый простой способ сделать это - создать цикл для сравнения каждого значения с другим. Пока есть разрыв в «цепочке», он будет возвращать ложь. Если первый равен второму, второй равен третьему и т. Д., То можно сделать вывод, что все элементы массива равны друг другу.
учитывая массив данных [], то вы можете использовать:
источник
источник
Обновите новое решение: проверьте индекс
Обновлено с ES6: использование
list.every
это самый быстрый способ:старая версия:
источник
Вы можете использовать это:
Функция сначала проверяет, является ли массив пустым. Если это так, его значения равны. В противном случае он фильтрует массив и принимает все элементы, отличные от первого. Если таких значений нет => массив содержит только равные элементы, иначе это не так.
источник
_.isEqual(object, other)
Функция Underscore, кажется, хорошо работает для массивов. Порядок элементов в массиве имеет значение, когда он проверяет равенство. Смотрите http://underscorejs.org/#isEqual .источник
источник
Это просто. Создайте функцию и передайте параметр. В этой функции скопируйте первый индекс в новую переменную. Затем создайте цикл for и переберите массив. Внутри цикла создайте цикл while с условием проверки, равна ли вновь созданная переменная всем элементам цикла. если его равное возвращаемое значение true после завершения цикла for, иначе возвращает ложное значение внутри цикла while
источник
Принял ответ работал большой , но я хотел бы добавить чуть - чуть. Мне это не помогло,
===
потому что я сравнивал массивы массивов объектов, однако в своем приложении я использовал пакет fast-deep-equal , который я очень рекомендую. С этим мой код выглядит так:и мои данные выглядят так:
источник
И ты СДЕЛАН!
источник
Теперь вы можете использовать наборы, чтобы сделать это легко.
источник
Вы можете использовать цикл for:
источник
Ну, это действительно не очень сложно. У меня есть сильное подозрение, что ты даже не попробовал. Вы выбираете первое значение, сохраняете его в переменной, а затем в
for
цикле сравниваете все последующие значения с первым.Я намеренно не поделился кодом. Найдите, как
for
используется и как сравниваются переменные.источник
Простое однострочное решение, просто сравните его с массивом, заполненным первой записью.
источник
Еще один интересный способ использования синтаксиса функции стрелки ES6:
И когда вы не хотите повторно использовать переменную для массива (x):
Предыдущий постер ИМО, который использовал array.every (...), имеет самое чистое решение.
источник
источник
это может сработать, вы также можете использовать код комментария, который также хорошо работает с заданным сценарием.
источник
Другой способ с ограниченным размером и упорядоченным списком:
массив1 = [1,2,3]; массив2 = [1,2,3];
источник
Вы можете конвертировать массив в набор и проверить его размер
В случае примитивных элементов массива, то есть
number
,string
:В случае массива объектов с некоторым полем, которое нужно проверить на эквивалентность, скажите
id
:источник
В PHP есть решение очень простой, однострочный метод:
(count (array_count_values ($ array)) == 1)
Например :
Вот и все.
источник