Eu tenho esses dois arrays: um é preenchido com informações de uma solicitação ajax e outro armazena os botões em que o usuário clica. Eu uso este código (preenchi com números de amostra):
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();
}
Mas sempre dá false
, mesmo que as duas matrizes sejam iguais, mas com nomes diferentes. (Eu verifiquei isso no console JS do Chrome). Então, há alguma maneira de eu saber se esses dois arrays contêm o mesmo? Por que está dando false
? Como posso saber quais valores no primeiro array não estão no segundo?
javascript
arrays
compare
Carlos precioso
fonte
fonte
Respostas:
Observe que isso não modifica os arrays originais, ao contrário da resposta anterior.
fonte
Se seus itens de array não são objetos - se eles são números ou strings, por exemplo, você pode comparar suas strings unidas para ver se eles têm os mesmos membros em qualquer ordem -
fonte
['a', 'b']
e['a,b']
. Eu recomendaria essa técnica apenas para pequenos scripts descartáveis.Se você quiser verificar apenas se dois arrays têm os mesmos valores (independentemente do número de ocorrências e da ordem de cada valor), você pode fazer isso usando lodash :
Curto, simples e bonito!
fonte
xor
nos documentos de sublinhado. Você está pensando em IODash?Talvez?
fonte
Por que seu código não funcionou
JavaScript possui tipos de dados primitivos e tipos de dados não primitivos.
Para tipos de dados primitivos,
==
e===
verifique se os itens de cada lado das barras têm o mesmo valor. É por isso que1 === 1
é verdade.Para tipos de dados não primitivos, como matrizes,
==
e===
verifique a igualdade de referência. Ou seja, eles verificam searr1
earr2
são o mesmo objeto. Em seu exemplo, os dois arrays têm os mesmos objetos na mesma ordem, mas não são equivalentes.Soluções
Duas matrizes,
arr1
earr2
, têm os mesmos membros se e somente se:arr2
está dentroarr1
E
arr1
está dentroarr2
Então, isso vai resolver o problema (ES2016):
Esta segunda solução usando Underscore está mais próxima do que você estava tentando fazer:
Funciona porque
isEqual
verifica a "igualdade profunda", o que significa que examina mais do que apenas igualdade de referência e compara valores.Uma solução para sua terceira pergunta
Você também perguntou como descobrir quais coisas em
arr1
não estão contidas emarr2
.Isso bastará (ES2015):
Você também pode usar o
difference
método do Underscore ::ATUALIZAR
Veja o comentário de @Redu - minha solução serve
sameMembers
, mas o que você deve ter em mentesameMembersInOrder
também é conhecido comodeepEquals
.ATUALIZAÇÃO 2
Se você não se preocupa com a ordem dos membros dos arrays, ES2015 +
Set
pode ser uma estrutura de dados melhor do queArray
. Consulte as notasisSuperset
difference
do MDN sobre como implementar e usar patching perigoso.fonte
sameMembers([1,1,2],[2,1,2]);
deve retornar falso.sameMembers([1,1,2],[2,1,2])
deve retornartrue
, na minha opinião.sameMembersInOrder([1,1,2],[2,1,2])
AKAdeepEquals([1,1,2],[2,1,2])
deve retornarfalse
.arr1.filter...
funcionará apenas para verificar se arr2 tem todos os elementos de arr1 ou não, mas não o contrário, que também é necessário.Verificação da igualdade do objeto:
JSON.stringify(array1.sort()) === JSON.stringify(array2.sort())
O teste acima também funciona com matrizes de objetos. Nesse caso, use uma função de classificação conforme documentado em http://www.w3schools.com/jsref/jsref_sort.asp
Pode ser suficiente para pequenos arrays com esquemas JSON simples.
fonte
Nosso objetivo é basicamente verificar se 2 arrays são conjuntos iguais. set é o conjunto definido matematicamente . A classificação mais rápida assintoticamente leva tempo O (nlog (n)) . Portanto, se você classificar um array, levará pelo menos O (nlog (n)) tempo. Mas você pode fazer essa tarefa mais rápido , que assintoticamente leva tempo O (n) (caso médio, não pior caso) com uma estrutura de dados de dicionário. Em JS, um dicionário é simplesmente um objeto com chaves e valores.
Observe que esta função funciona com arrays de tipos primitivos e assume
a1
ea2
são arrays.fonte
Que tal isso? ES 2017 eu suponho:
A 1ª condição verifica se ambas as matrizes têm o mesmo comprimento e a 2ª condição verifica se a 1ª matriz é um subconjunto da 2ª matriz. A combinação dessas 2 condições deve resultar na comparação de todos os itens das 2 matrizes, independentemente da ordem dos elementos.
O código acima só funcionará se ambas as matrizes tiverem itens não duplicados.
fonte
Quando você compara esses dois arrays, está comparando os objetos que representam os arrays, não o conteúdo.
Você terá que usar uma função para comparar os dois. Você pode escrever o seu próprio que simplesmente faz um loop em um e o compara com o outro depois de verificar se os comprimentos são iguais.
fonte
Solução simples para igualdade superficial usando ES6:
Cria cópias superficiais de cada matriz e as classifica. Em seguida, usa
some()
para percorrer osarr1test
valores, verificando cada valor em relação ao valorarr2test
do mesmo índice. Se todos os valores forem iguais,some()
retornafalse
e, por sua vez,equal
avalia comotrue
.Também poderia usar
every()
, mas teria que percorrer todos os elementos da matriz para satisfazer umtrue
resultado, ao passo quesome()
desaparecerá assim que encontrar um valor diferente de:fonte
Eu tinha valores inteiros simples em um projeto de jogo.
Tinha menos número de valores em cada array, também precisava daquele array original intocado.
Então, eu fiz o abaixo, funcionou bem. (Código editado para colar aqui)
Espero que ajude.
fonte
Usando ES6
Usaremos a
equals
função de Ramda , mas em vez disso podemos usar Lodash ou UnderscoreisEqual
:Usando o spread opporator, evitamos a mutação dos arrays originais e mantemos nossa função pura.
fonte
Você pode usar em
reduce
vez de loops para parecer inteligente, mas correndo o risco de que seus colegas desenvolvedores pensem em você como um espertinho.fonte
Se os itens na matriz forem primitivos (números ou caracteres únicos), você pode usar uma combinação de comprimentos de comparação e conjuntos.
fonte
Já estamos em 2020, mas notei que a maioria das outras soluções usam sort, O (n * log n), usam bibliotecas ou têm complexidade O (n ^ 2).
Aqui está uma solução Javascript pura com complexidade linear, O (n):
Testes:
fonte
Se você estiver usando o Prototype Framework, você pode usar o método intersect de uma matriz para descobrir se eles são os mesmos (independentemente da ordem):
fonte
[1,2].intersect([1,2,3]).length === [1,2].length
retorna verdadeiro. Você deve comparar o comprimento dos arrays originais também, eu editei o post para demonstrar.array1 = [1,1,2]; array2 = [1,1,2];
... a resposta original não falha para essa entrada._.difference(array1, array2).length;
por favor, verifique esta resposta
fonte
return
não terá efeito. Em segundo lugar, você deve verificar os arrays classificados, pois[1,2]
e[2,1]
serão detectados como diferentes. Terceiro e mais importante, isso realmente só verificará se algum elemento é o mesmo. O condicional deve serif (array1!==array2) {return false;}
. Talvez isso possa ajudá-lo no futuro!array1
earray2
pode ser renomeadoelem1
eelem2
. Essas duas dicas vão lhe poupar muitas dores de cabeça no futuro!Respondendo depois de muito tempo, mas espero que isso ajude alguém que procura uma solução simples e novatos modernos.
Agora podemos conseguir isso usando várias bibliotecas como
lodash
,underscore
etc. (Isso se torna parte do projeto hoje em dia devido à simplicidade, vários recursos e alto uso)Você pode usar o cruzamento da biblioteca Lodash.
Isso funcionará para qualquer tipo de dados.
fonte
Se você quiser comparar dois arrays e verificar se algum objeto é o mesmo em ambos os arrays, funcionará. Exemplo:
Matriz1 = [a, b, c, d]
Matriz2 = [d, e, f, g]
Aqui, 'd' é comum em ambas as matrizes, portanto, esta função retornará o valor verdadeiro.
fonte
Tente isto
fonte
Eu tenho outra maneira baseada na resposta aceita.
fonte
Uma função para comparar dois Arrays, para verificar se ambos têm os mesmos elementos. Mesmo se eles estiverem fora de serviço ...
É bom para arrays simples. [String, Number, Boolean, null, NaN].
Eu não uso .sort (), ele modifica o array original. Alguns dizem que é ruim ...
Cuidado. Esta função é limitada, ela não pode comparar objetos "[], {}" ou funções dentro desses Arrays, os próprios arrays são Objetos.
fonte
Solução simples para comparar os dois arrays:
fonte