SOMENTE DESEMPENHO! esse código é provavelmente 10 vezes mais rápido que todos os códigos aqui * funciona em todos os navegadores e também tem o menor impacto na memória .... e mais
se você não precisar reutilizar o array antigo, faça as outras operações necessárias antes de convertê-lo em exclusivo aqui, provavelmente é a maneira mais rápida de fazer isso, também muito curta.
var array=[1,2,3,4,5,6,7,8,9,0,1,2,1];
então você pode tentar isso
var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 1];
function toUnique(a, b, c) { //array,placeholder,placeholder
b = a.length;
while (c = --b)
while (c--) a[b] !== a[c] || a.splice(c, 1);
return a // not needed ;)
}
console.log(toUnique(array));
//[3, 4, 5, 6, 7, 8, 9, 0, 2, 1]
Eu vim com essa função lendo este artigo ...
http://www.shamasis.net/2009/09/fast-algorithm-to-find-unique-items-in-javascript-array/
Eu não gosto do loop for. ele tem muitos parâmetros. eu gosto do loop while--. enquanto é o loop mais rápido em todos os navegadores, exceto no que todos gostamos tanto ... chrome.
de qualquer maneira eu escrevi a primeira função que usa while.E sim, é um pouco mais rápido que a função encontrada no article.but não é suficiente.unique2()
próximo passo use js modernos. Object.keys
Substituí o outro por loop com Object.keys do js1.7 ... um pouco mais rápido e mais curto (no chrome 2x mais rápido);). Insuficiente!. unique3()
.
Neste ponto, eu estava pensando sobre o que eu realmente preciso em MINHA função única. não preciso da matriz antiga, quero uma função rápida. então eu usei 2 enquanto loops + emenda.unique4()
Inútil dizer que fiquei impressionado.
chrome: as 150.000 operações usuais por segundo saltaram para 1.800.000 operações por segundo.
ou seja: 80.000 op / s vs 3.500.000 op / s
ios: 18.000 op / s vs 170.000 op / s
safari: 80.000 op / s vs 6.000.000 op / s
Prova
http://jsperf.com/wgu ou melhor, use console.time ... microtime ... qualquer que seja
unique5()
é apenas para mostrar o que acontece se você deseja manter a matriz antiga.
Não use Array.prototype
se você não sabe o que está fazendo. Eu apenas fiz um monte de cópia e passado. Use Object.defineProperty(Array.prototype,...,writable:false,enumerable:false})
se você deseja criar um protótipo nativo. Exemplo: https://stackoverflow.com/a/20463021/2450730
Demo
http://jsfiddle.net/46S7g/
NOTA: sua matriz antiga é destruída / torna-se única após esta operação.
se você não consegue ler o código acima, pergunte, leia um livro javascript ou aqui estão algumas explicações sobre códigos mais curtos. https://stackoverflow.com/a/21353032/2450730
alguns estão usando indexOf
... não ... http://jsperf.com/dgfgghfghfghghgfhgfhfghfhgfh
para matrizes vazias
!array.length||toUnique(array);