Pregunta

Tengo una matriz dispersa en Jscript, con elementos no nulos que ocurren tanto en índices negativos como positivos. Cuando trato de usar un bucle for in, no atraviesa la matriz del índice más bajo (negativo) al índice positivo más alto. En su lugar, devuelve la matriz en el orden en que agregué los elementos. La enumeración tampoco funciona. ¿Hay algún método que me permita hacer eso?

Ejemplo

arrName = new Array();
arrName[-10] = "A";
arrName[20] = "B";
arrName[10] = "C";

Al pasar en bucle, debería darme A y luego C la B

¿Fue útil?

Solución

Técnicamente, " A " no está en el Array ya que no puede tener un índice negativo. Es solo un miembro del objeto arrName. Si marca arrName.length, verá que es 21 (0,1,2, ..., 20). Por qué no usa un objeto plano en su lugar (como una tabla hash). Algo como esto debería funcionar:

<script type="text/javascript">
//define and initialize your object/hastable
var obj = {};
obj[20] = 'C';
obj[10] = 'B';
obj[-10] = 'A';

// get the indexes and sort them
var indexes = [];
for(var i in obj){
    indexes.push(i);
}
indexes.sort(function(a,b){
    return a-b;
});

// write the values to the page in index order (increasing)
for(var i=0,l=indexes.length; i<l; i++){
    document.write(obj[indexes[i]] + ' ');
}
// Should print out as "A B C" to the page
</script>

Otros consejos

Te estás topando con el límite entre Array y Object en Javascript. Se accede a los elementos de la matriz por ordinal, un número entero entre 0 y 4294967294 (máximo entero de 32 bits sin signo - 1), inclusive. Se accede a las propiedades del objeto por su nombre. Dado que -10 no es un número ordinal válido, se interpreta como un nombre. Aquí hay un ejemplo más simple:

var arr = new Array();
arr[0] = 'A';
arr[1] = 'B';
arr[-1] = 'C';
arr.length

El resultado es 2: solo hay dos elementos en la matriz, en los índices 0 y 1.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top