2009-10-15 982 views
5

Solo una pregunta simple que parece que no puedo encontrar la respuesta.Encontrar la longitud de la matriz de Javascript sin elementos eliminados

myArray.length()

El anterior devolverá la longitud incluyendo elementos eliminados. ¿Cómo obtengo la longitud sin elementos eliminados? Gracias

EDITAR:

Gracias por las respuestas. Estoy borrando escribiendo 'eliminar myarray [0]' y esto funciona bien. Otras secciones del script se basan en el método length() para devolver la longitud, incluidas las eliminaciones. El método de empalme se parece a lo que quiero, así que intentaré esto

Respuesta

13

Creo que está borrando sus elementos de matriz usando delete operator.

Este operador retira el elemento en el índice especificado, pero la longitud de la matriz no se ve afectada, por ejemplo:

var a = [1,2,3]; 

delete a[0]; 

console.log(a); // results in [undefined, 2, 3] 

Si desea eliminar los elementos y cambiar los índices, puede utilizar la splice función:

var a = [1,2,3]; 

a.splice(0,1); 

console.log(a); // [2, 3] 

Se podría implementar una función sencilla para eliminar elementos en un índice dado:

Array.prototype.removeAt = function (index) { 
    this.splice(index,1); 
}; 
+3

¿Cómo no odias javascript ... –

1

John Resig (autor de jQuery) escribió una función que (realmente) elimina elementos de una matriz en Javascript. Si usa esta función en lugar del operador de eliminación, debe obtener una cuenta precisa de la matriz después de la eliminación.

http://ejohn.org/blog/javascript-array-remove/

+0

¿Sabes por qué lo hizo? Parece ser redundante, con un rendimiento peor que el método estándar de empalme incorporado. – bobince

+0

El método es completo; usa Splice, pero también hace otras cosas. –

1

Si por alguna razón usted desea utilizar matrices dispersas (totalmente legítimo) pero quiere contar el número de elementos definidos, sólo puede utilizar reduce(), por ejemplo:

var arr = [1, 2, undefined, 3, undefined, undefined, 4]; 
arr.reduce(function(prev, curr) { 
    return typeof curr !== "undefined" ? prev+1 : prev; 
}, 0); // evaluates to 4 

reduce() es compatible con todos los navegadores modernos, IE9 +. Para los navegadores más antiguos, hay un polyfill y más información en MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

+0

Esto funcionó para mí ya que necesitaba mantener los índices de mi matriz. – Ozzyberto

1

Puede usar para ... en el bucle, que omite los elementos eliminados.

var a = [1,2,3,4,5]; 
delete a[0]; 
delete a[1]; 

for(var i=0;i<a.length;i++){} 
console.log(i); //5 

var j=0; 
for(var i in a){j++;} 
console.log(j); //3 
+0

Esto puede ser miles de veces más rápido que el enfoque reductor sugerido por tobek. https://jsperf.com/length-of-sparse-array/1 – Luckyrat

Cuestiones relacionadas