2008-09-27 7 views
3

У меня есть разреженный массив в Jscript с ненулевыми элементами, имеющими как отрицательные, так и положительные индексы. Когда я пытаюсь использовать цикл for for, он не пересекает массив с самого низкого (отрицательного) индекса на самый высокий положительный индекс. Вместо этого он возвращает массив в том порядке, в котором я добавил элементы. Перечисление тоже не работает. Есть ли способ, который позволит мне это сделать?Перемещение отрицательных разложений в массиве в JScript

Пример

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

Когда цикл через, он должен дать мне то С Б.

ответ

9

Технически, «А» не в массиве вообще, так как вы не можете имеют отрицательный индекс. Это всего лишь член объекта arrName. Если вы проверите arrName.length, вы увидите, что это 21 (0,1,2, ..., 20). Почему бы вам вместо этого использовать простой объект (как хэш-таблицу). Нечто подобное должно работать:

<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> 
4

Вы натыкаясь на границе между Array с и Object с в JavaScript. Доступ к элементам массива осуществляется по порядку, целое число от 0 до 4294967294 (максимальное 32-разрядное целое число без знака - 1) включительно. Доступ к объектам осуществляется по имени. Поскольку -10 не является допустимым порядковым номером, оно интерпретируется как имя. Вот простой пример:

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

Результат 2 - есть только два элемента в массиве, с индексами 0 и 1.