Eu tenho duas matrizes de objetos JavaScript que gostaria de comparar para ver se eles são iguais. Os objetos podem não estar (e provavelmente não estarão) na mesma ordem em cada array. Cada array não deve ter mais do que 10 objetos. Achei que o jQuery poderia ter uma solução elegante para esse problema, mas não consegui encontrar muito online.
Eu sei que uma $.each(array, function(){})
solução aninhada bruta pode funcionar, mas há alguma função embutida que eu não conheço?
Obrigado.
[0,1] == {0:0,1:1,length=2}
$(arr1).not(arr2).length == 0
não é suficiente?not
é uma função de filtro, não uma função de igualdade. Experimente com[1,2]
e[1]
. Em uma ordem, você obterá[]
, e em outra, você receberá[2]
.not
não funciona mais com objetos genéricos desde 3.0.0-rc1. Consulte github.com/jquery/jquery/issues/3147Eu também estava procurando por isso hoje e encontrei: http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256BFB0077DFFD
Não sei se essa é uma boa solução, embora eles mencionem algumas considerações de desempenho levadas em consideração.
Gosto da ideia de um método auxiliar jQuery. @David Eu prefiro ver seu método de comparação funcionar como:
Não faz sentido para mim fazer:
onde aeb são matrizes. Normalmente, quando você $ (algo), você estaria passando uma string de seletor para trabalhar com elementos DOM.
Também em relação à classificação e 'armazenamento em cache' dos arrays classificados:
Parece que o que precisamos fazer é copiar os arrays antes de trabalhar neles. A melhor resposta que pude encontrar sobre como fazer isso de uma forma jQuery foi por ninguém menos que John Resig aqui no SO! Qual é a maneira mais eficiente de clonar profundamente um objeto em JavaScript? (veja os comentários em sua resposta para a versão de array da receita de clonagem de objetos)
Nesse caso, acho que o código para isso seria:
fonte
Minha abordagem foi bem diferente - eu aplainei ambas as coleções usando JSON.stringify e usei uma string normal compare para verificar a igualdade.
Ie
NB: Por favor, note que seu método assume que ambas as coleções são classificadas de maneira semelhante, caso contrário, você obteria um resultado falso!
fonte
Converta ambos array em string e compare
fonte
Eu encontrei essa discussão porque precisava de uma maneira de comparar profundamente arrays e objetos. Usando os exemplos aqui, eu vim com o seguinte (dividido em 3 métodos para maior clareza):
Testando
fonte
No meu caso, as matrizes comparadas contêm apenas números e strings . Esta solução funcionou para mim:
Vamos testar!
fonte
Não acho que haja uma boa maneira "jQuery" de fazer isso, mas se você precisar de eficiência, mapeie um dos arrays por uma determinada chave (um dos campos de objeto únicos) e, em seguida, faça a comparação percorrendo o outro array e comparando com o mapa, ou array associativo, que você acabou de construir.
Se a eficiência não for um problema, basta comparar todos os objetos em A com todos os objetos em B. Contanto que | A | e | B | são pequenos, você deve estar bem.
fonte
Bem, se você quiser comparar apenas o conteúdo de arrays, há uma função jQuery útil $ .inArray ()
fonte
Mude a matriz para string e compare
fonte
O bom forro de Sudhakar R como método global jQuery.
fonte
Eu também descobri isso ao tentar fazer algumas comparações de array com jQuery. No meu caso, eu tinha strings que sabia serem arrays:
Mas eu me importava se era uma correspondência completa ou apenas parcial, então usei algo como o seguinte, baseado na resposta de Sudhakar R:
fonte
Se duplicatas importam de forma que
[1, 1, 2]
não deveriam ser iguais,[2, 1]
mas deveriam ser iguais[1, 2, 1]
, aqui está uma solução de contagem de referência:Aqui está o violino para brincar .
fonte
fonte
Tente isto
fonte