A veces se encuentra este tipo de requisito, y debe eliminar elementos duplicados en la matriz y mantener solo uno. El primer método que viene a la mente es probablemente usar 2 para bucles para comparar y eliminar elementos duplicados. El código es el siguiente:
Método 1:
La copia del código es la siguiente:
Array.prototype.distinct = function () {
var arr = [],
len = this.length;
para (var i = 0; i <len; i ++) {
para (var j = i+1; j <len; j ++) {
if (this [i] === this [j]) {
j = ++ i;
}
}
arr.push (este [i]);
}
regresar arr;
};
Método de uso 1 Si encuentra más datos, su rendimiento será mucho peor. Entonces, continúe viendo el siguiente método.
Método 2:
La copia del código es la siguiente:
Array.prototype.distinct = function () {
var self = this,
arr = self.concat (). sort (); // crear una nueva matriz y ordenarla
arr.sort (función (a, b) {
if (a === b) {
var n = self.indexof (a); // Obtener valor de índice
self.splice (n, 1);
}
});
volver a sí mismo;
};
El método 2 utiliza la función de devolución de llamada personalizada de SAT, y también usa IndexOF, un método que no es compatible con IE6/7/8. Por supuesto, IndexOF se puede simular por sí mismo, pero el mayor problema es que también hay una diferencia entre el método de clasificación de IE6/7/8 y el navegador estándar. Hay muchas trampas en funciones de devolución de llamada personalizadas que utilizan el método de clasificación en IE6/7/8. El código de la función de devolución de llamada de clasificación personalizada anterior informará directamente el error "Número faltante" en IE6/7/8. Si la función de devolución de llamada devuelve NAN, este error se informará, porque en la teoría, la función de devolución de llamada de clasificación solo puede devolver enteros. Incluso si se ignora el valor de retorno, todavía hay otros problemas, y al final, no hay demasiados problemas. El método 2 no funcionará en IE6/7/8.
De The Fool's Wharf, aquí está su código:
La copia del código es la siguiente:
Array.prototype.delrepeat = function () {
var newArray = [];
var provisionalTable = {};
para (var i = 0, elemento; (item = this [i])! = null; i ++) {
if (! provisionalTable [item]) {
newArray.push (elemento);
provisionAlable [item] = true;
}
}
devolver NewArray;
};
El método 3 utiliza un objeto temporal para almacenar los elementos de la matriz. Si encuentra elementos de matriz duplicados, se ignorará. Sin embargo, si encuentra la siguiente matriz:
La copia del código es la siguiente:
var arr = ['Firefox', 1, '1'];
Si la matriz anterior se usa en el Método 3, eliminará por error 1 y "1" como elementos duplicados, por lo que se puede resolver una pequeña modificación del Método 3.
Una versión modificada del método 3:
La copia del código es la siguiente:
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;
}
}
regresar arr;
};
Más tarde leí los comentarios al final del artículo sobre Fools Wharf. Este método es el mismo que el método proporcionado por Rekey, pero este método también tiene errores. Si encuentra una matriz de 2B, estará bien:
La copia del código es la siguiente:
var arr = ['Firefox', 1, '1', 1];
La matriz anterior se modifica con el método 3, y los últimos 3 elementos no se eliminarán. Sin embargo, este tipo de matriz es un poco extrema. Si encuentra datos con el mismo tamaño literal y número de cadenas, debe procesarse por adelantado para evitar este error. El método de uso de objetos temporales es ligeramente más rápido que el tipo en los navegadores estándar, y los algoritmos del método de clasificación también deben ser diferentes en cada navegador.