Ao executar operações de matriz, você geralmente encontra o problema de remover duplicatas. A seguir, é apresentada uma breve introdução ao método de desduplicação de matrizes.
Índicef Deduplication
Array.prototype.unique1 = function () {var arr = []; para (var i = 0; i <this.length; i ++) {var item = this [i]; if (arr.IndexOF (item) === -1) {ar.push (item);}} retornar arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique1 (); // [1, 2, 3, "4", 4, "34"]No entanto, no IE6-8, o método de matriz do INDEXOF ainda não existe (embora este seja um tópico um pouco antigo o (∩_∩) o ~), mas os programadores precisam escrever um método de índice de:
var indexOf = [] .IndexOf? function (priv, item) {return arr.Indexof (item);}: função indexOf (arr, item) {for (var i = 0; i <arr.length; i ++) {if (arr [i] === item) {return i;}}}} retornar -1;} array.protype.unique2 = 0, {}}}; {var item = this [i]; if (arr.IndexOf (item) === -1) {arr.push (item);}} retornar arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique2 (); // [1, 2, 3, "4", 4, "34"]IndexOf também pode usar esta maneira de re-reconstrução:
Array.prototype.unique3 = function () {var arr = [this [0]]; para (var i = 1; i <this.length; i ++) {if (this.indexOf (this [i]) == i) {arr.push (this [i]);}} retorna arr;} [1,2,3, '4', 3,4,1, '34 ', 2] .Unique3 (); // [1, 2, 3, "4", 4, "34"]Hash para recarregar
O indexOF acima está correto, mas em termos de desempenho, o ciclo duplo reduzirá o desempenho. Então usamos hash.
Array.prototype.unique4 = function () {var arr = []; var hash = {}; para (var i = 0; i <this.Length; i ++) {var item = this [i]; var key = typeOf (item)+itemif (hashH [key]! == 1) {arr.push (item); arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique4 (); // [1, 2, 3, "4", 4, "34"]O núcleo é construir um objeto de hash para substituir o indexOF. Mude espaço para o tempo. Note that in JavaScript, the key value of an object can only be a string (of course, ES6 provides a Map data structure. It is similar to an object and is also a collection of key-value pairs, but the scope of "key" is not limited to strings. All types of values (including objects) can be regarded as keys. In other words, the Object structure provides a "string-value" correspondence, and the Map structure provides a "value-value" correspondence, which is a Representação mais completa da estrutura de hash.), então é necessário var chave = typeof (item) + item é necessário para distinguir entre o valor 1 e a string '1'.
Então, se você quiser '4' e 4 para ser considerado o mesmo (as outras abordagens são as mesmas)
Array.prototype.unique5 = function () {var arr = []; var hash = {}; para (var i = 0, len = this.lengthn; arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique5 (); // [1, 2, 3, "4", "34"]Após a classificação, descreva
Array.prototype.unique6 = function () {this.sort (); var arr = [this [0]]; para (var i = 1; i <this.Length; i ++) {if (this [i]! == Arr [Arr.Length-1]) {Arr.push (este [i]);}} Return arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique6 (); // [1, 2, 3, "34", "4", 4]Primeiro, classifique a matriz e depois compare dois valores adjacentes. Ao classificar, use o método de classificação nativo do JS, para que seja muito rápido. Existe apenas uma desvantagem neste método. Ao comparar caracteres, eles são classificados na ordem da codificação de caracteres. Portanto, você verá que 10 é classificado em primeiro lugar em 2. No entanto, isso não afetará a remoção do peso pesado. No entanto, para resolver o problema, o método de classificação aceita um parâmetro, que é um método:
função compare (value1, value2) {if (value1 <value2) {return -1;} else if (value1> value2) {return 1;} else {return 0;}} [1,2,5,2,10,3,20] .sort (compare); // [1, 2, 2, 3, 5, 10, 20]Definido para recarregar
O ES6 fornece um novo conjunto de estrutura de dados. É semelhante a uma matriz, mas os valores dos membros são todos únicos, sem valores duplicados. O navegador agora está totalmente suportado e o nó do servidor também é suportado.
Array.prototype.unique7 = function () {return Array.From (new Set (this));} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique7 (); // [1, 2, 3, "4", 4, "34"]Biblioteca de métodos
Recomendou uma biblioteca de métodos subldrcore.js, que é muito popular no nó ou no navegador JS.
const _ = requer ('sublinhado'); _. Uniq ([1, 2, 1, 3, 1, 4]); // [1, 2, 3, 4]Tempo de teste
Todos os métodos acima podem ser testados de maneira simples e, em seguida, compare e selecione os melhores métodos:
console.time ("teste"); [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique7 (); console.timeEnd ("test"); ==> vm314: 3 teste: 0,378msPara aumentar os dados, crie 1 milhão de números aleatoriamente:
var arr = []; var num = 0; para (var i = 0; i <1000000; i ++) {num = Math.floor (Math.random ()*100); arr.push (num);} console.time ("test"); arr.unique7 (); console.timeEng ("test");O exposto acima é a desduplicação do JavaScript Array que o editor apresentou a você do lento ao rápido de médio ao simples. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!