Eu preciso encontrar matrizes onde todos os valores são iguais. Qual é a maneira mais rápida de fazer isso? Devo percorrê-lo e apenas comparar valores?
['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
javascript
jquery
Marvin3
fonte
fonte
a.join(',').split(a[0]).length === a.length + 1
Respostas:
Ou uma linha:
Array.prototype.every (from MDN): O
every()
método testa se todos os elementos da matriz são aprovados no teste implementado pela função fornecida.fonte
const everythings_equal = array => array.every(thing => thing === array[0]);
some
em vez deevery
:arr.some( v => v !== arr[0] )
. Isso retornará logo que o primeiro elemento for considerado desigualarr[0]
.every
também retorna cedo.Edit: Seja um ninja vermelho:
Resultados:
Aviso:
Isso ocorre porque não passamos um valor inicial . Portanto, você pode verificar
array.length
primeiro.fonte
false
s! por exemplo, tente [false, false, false] .reduce (function (a, b) {return (a === b)? a: false;});["false", ""]
retornatrue
: /NaN
. Como ambosNaN === NaN
eNaN !== NaN
são falsos, garante que, uma vezprev
definido como NaN, nenhum valor possa removê-lo. A adição de uma dupla negação também converte os resultados emtrue
efalse
, uma vez queNaN
é falso. Forma final:!!array.reduce(function(a, b){ return (a === b) ? a : NaN; });
Isso funciona. Você cria um método na matriz usando o protótipo.
Chame assim:
fonte
Array.prototype
multa (até o IE6). São apenas os protótipos de elementos DOM que algumas versões mais antigas do IE não oferecem suporte ao aumento.allValuesSame
no loopNo JavaScript 1.6, você pode usar
Array.every
:Você provavelmente precisará de algumas verificações de integridade, por exemplo, quando o array não possui elementos. (Além disso, isso não funcionará quando todos os elementos forem
NaN
desde entãoNaN !== NaN
, mas isso não deve ser um problema ... certo?)fonte
Você pode transformar a matriz em um conjunto. Se o tamanho do conjunto for igual a 1, todos os elementos da matriz serão iguais.
fonte
allEqual([NaN, NaN])
dátrue
neste caso.E para comparação de desempenho, também fiz uma referência:
Resultados:
Então, aparentemente, o uso do array.some () interno é o método mais rápido dos exemplos.
fonte
Array#some
desempenho às vezes é superior é que, quando a função de retorno de chamada retorna verdadeira, ela pára de iterar. Portanto, se todos os elementos forem de fato iguais, o desempenho deverá ser idêntico aArray#every
. E o desempenho relativo quando todos os elementos não forem iguais variará com base no índice do primeiro elemento não correspondente.Resposta mais curta usando sublinhado / lodash
especificação:
editar:
Ou ainda mais, inspirado na resposta de Tom:
especificação:
fonte
Se você já está usando underscore.js , aqui está outra opção usando
_.uniq
:_.uniq
retorna uma versão sem duplicado da matriz. Se todos os valores forem iguais, o comprimento será 1.Conforme mencionado nos comentários, como você pode esperar que uma matriz vazia retorne
true
, verifique também o caso:fonte
false
. Enquanto eu acho que deveria sertrue
. Mudar para.length <= 1
deve ser o suficiente.Sim, você também pode verificá-lo usando o filtro abaixo, muito simples, verificando todos os valores iguais aos do primeiro:
Também pode ser feito usando todos os métodos na matriz:
e você pode verificar suas matrizes como abaixo:
Ou você pode adicioná-lo às funcionalidades nativas de Array em JavaScript, se você o reutilizar muito:
e você pode verificar suas matrizes como abaixo:
fonte
Você pode usar
Array.every
se suportado:A abordagem alternativa de um loop pode ser algo como
sort
Ou, se os itens forem como a pergunta, algo sujo como:
Também funciona.
fonte
equals = !array.some( (v,i,a) => v!==a[0] )
. Caso contrário, você está apenas verificando que qualquer valor é igual ao primeiro que irá, naturalmente, ser sempre verdade :)some
vez deevery
como mencionei no primeiro parágrafo. :) Obrigado pela captura!Você pode obter esse one-liner para fazer o que quiser usando as funções de seta Array.prototype.every , Object.is e ES6:
fonte
Eu acho que a maneira mais simples de fazer isso é criar um loop para comparar cada valor ao próximo. Enquanto houver uma quebra na "cadeia", ela retornará falsa. Se o primeiro é igual ao segundo, o segundo é igual ao terceiro e assim por diante, podemos concluir que todos os elementos da matriz são iguais entre si.
dado um dado de matriz [], você pode usar:
fonte
fonte
Atualizar nova solução: verificar índice
Atualizado com o ES6: o uso
list.every
é a maneira mais rápida:versão antiga:
fonte
Você pode usar isto:
A função primeiro verifica se a matriz está vazia. Se for, seus valores são iguais. Caso contrário, ele filtra a matriz e pega todos os elementos diferentes do primeiro. Se não houver tais valores => a matriz contém apenas elementos iguais, caso contrário não.
fonte
A
_.isEqual(object, other)
função de sublinhado parece funcionar bem para matrizes. A ordem dos itens na matriz importa quando verifica a igualdade. Veja http://underscorejs.org/#isEqual .fonte
fonte
É simples. Crie uma função e passe um parâmetro. Nessa função, copie o primeiro índice para uma nova variável. Em seguida, crie um loop for e faça um loop na matriz. Dentro de um loop, crie um loop while com uma condição que verifique se a nova variável criada é igual a todos os elementos no loop. se seu retorno igual true após o loop for concluído, retorne false dentro do loop while.
fonte
A resposta aceita funcionou muito bem, mas eu queria acrescentar um pouquinho. Não funcionou para mim usar
===
porque estava comparando matrizes de matrizes de objetos; no entanto, em todo o meu aplicativo, usei o pacote de igualdade profunda rápida que recomendo vivamente. Com isso, meu código fica assim:e meus dados ficam assim:
fonte
E você está FEITO!
fonte
Agora você pode usar conjuntos para fazer isso facilmente.
fonte
Você pode usar um loop for:
fonte
Bem, isso realmente não é muito complicado. Eu tenho uma forte suspeita de que você nem tentou. O que você faz é escolher o primeiro valor, salvá-lo na variável e, em um
for
loop, comparar todos os valores subsequentes com o primeiro.Eu intencionalmente não compartilhei nenhum código. Descubra como
for
é usado e como as variáveis são comparadas.fonte
Solução simples de uma linha, basta compará-la com uma matriz preenchida com a primeira entrada.
fonte
Outra maneira interessante quando você usa a sintaxe da função de seta ES6:
E quando você não deseja reutilizar a variável para o array (x):
O pôster anterior da OMI que usou array.every (...) tem a solução mais limpa.
fonte
fonte
isso pode funcionar, você também pode usar o código de comentário que também funciona bem com o cenário fornecido.
fonte
Outra maneira com tamanho delimitado e lista organizada:
matriz1 = [1,2,3]; matriz2 = [1,2,3];
fonte
Você pode converter a matriz em um conjunto e verificar seu tamanho
No caso de entradas de matriz primitivo, isto é
number
,string
:No caso de matriz de objetos com algum campo a ser testado para equivalência, diga
id
:fonte
No PHP, existe uma solução muito simples, com um método de linha:
(count (array_count_values ($ array)) == 1)
Por exemplo :
Isso é tudo.
fonte