Às vezes, esse tipo de exigência é encontrado e você precisa excluir elementos duplicados na matriz e manter apenas um. O primeiro método que vem à mente provavelmente é usar 2 para loops para comparar e remover elementos duplicados. O código é o seguinte:
Método 1:
A cópia do código é a seguinte:
Array.prototype.distinct = function () {
var arr = [],
len = this.length;
for (var i = 0; i <len; i ++) {
for (var j = i+1; j <len; j ++) {
if (este [i] === this [j]) {
j = ++ i;
}
}
Arr.push (este [i]);
}
retornar arr;
};
Método de uso 1 Se você encontrar mais dados, seu desempenho será muito pior. Em seguida, continue a ver o seguinte método.
Método 2:
A cópia do código é a seguinte:
Array.prototype.distinct = function () {
var self = this,
arr = self.Concat (). Sort (); // Crie uma nova matriz e classifique -a
Arr.sort (função (a, b) {
if (a === b) {
var n = self.indexOf (a); // Obtenha o valor do índice
self.splice (n, 1);
}
});
voltar a si;
};
O Método 2 usa a função de retorno de chamada personalizada e também usa o IndexOF, um método que não é suportado pelo IE6/7/8. Obviamente, o indexOF pode ser simulado por si só, mas o maior problema é que também há uma diferença entre o método de classificação do IE6/7/8 e o navegador padrão. Existem muitas armadilhas nas funções de retorno de chamada personalizadas que usam o método de classificação no IE6/7/8. O código da função de retorno de chamada de classificação personalizada acima reportará diretamente o erro "Número ausente" no IE6/7/8. Se a função de retorno de chamada retornar NAN, esse erro será relatado, porque, em teoria, a função de retorno de chamada de classificação pode retornar apenas números inteiros. Mesmo que o valor de retorno seja ignorado, ainda existem outros problemas e, no final, não há muitos problemas. O método 2 não funcionará no IE6/7/8.
Do cais do tolo, aqui está o código dele:
A cópia do código é a seguinte:
Array.prototype.delRepeat = function () {
var newArray = [];
var provisionAltable = {};
for (var i = 0, item; (item = this [i])! = null; i ++) {
if (! provisionaltable [item]) {
newArray.push (item);
provisionaltable [item] = true;
}
}
retornar newarray;
};
O método 3 usa um objeto temporário para armazenar os elementos da matriz. Se você encontrar elementos de matriz duplicados, ele será ignorado. No entanto, se você encontrar a seguinte matriz:
A cópia do código é a seguinte:
var arr = ['Firefox', 1, '1'];
Se a matriz acima for usada no método 3, ele excluirá erroneamente 1 e "1" como elementos duplicados, para que uma pequena modificação do método 3 possa ser resolvida.
Uma versão modificada do método 3:
A cópia do código é a seguinte:
Array.prototype.distinct = function () {
var arr = [],
obj = {},
i = 0,
len = this.length,
resultado;
para (; i <len; i ++) {
resultado = este [i];
if (obj [resultado]! == resultado) {
Arr.push (resultado);
obj [resultado] = resultado;
}
}
retornar arr;
};
Mais tarde, li os comentários no final do artigo sobre o Wharf da Fools. Esse método é o mesmo que o método fornecido pelo rekey, mas esse método também possui bugs. Se você encontrar uma matriz de 2b, você ficará bem:
A cópia do código é a seguinte:
var arr = ['Firefox', 1, '1', 1];
A matriz acima é modificada com o método 3 e os três últimos elementos não serão excluídos. No entanto, esse tipo de matriz é um pouco extremo. Se você encontrar dados com o mesmo tamanho literal e número de strings, você deve ser processado com antecedência para evitar esse bug. O método de usar objetos temporários é um pouco mais rápido que a classificação nos navegadores padrão, e os algoritmos do método de classificação também devem ser diferentes em cada navegador.