Обход отрицательных значений массива в JScript - PullRequest
3 голосов
/ 27 сентября 2008

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

* ** 1003 тысяча два * Пример
arrName = new Array();
arrName[-10] = "A";
arrName[20] = "B";
arrName[10] = "C";

При циклическом прохождении он должен дать мне A, а затем C B.

Ответы [ 2 ]

9 голосов
/ 27 сентября 2008

Технически, «А» вообще не находится в массиве, так как у вас не может быть отрицательного индекса. Это просто член объекта 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 голосов
/ 27 сентября 2008

Вы сталкиваетесь с границей между 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.

...