Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обход массива в строгом порядке (https://javascript.ru/forum/misc/13537-obkhod-massiva-v-strogom-poryadke.html)

nibble 02.12.2010 13:12

Обход массива в строгом порядке
 
В ходе разработки получился массив-объект с числовыми ключами. К примеру, такой:
var words={"4": "who", "1": "are", "5": "you"}
При его обходе с помощью
for (var i in words) { document.write(words[i]) }
мне нужно, чтобы он выдал "who are you", то есть, чтобы обход был строго в том порядке, в каком я этот массив инициализировал.
А на деле массив сортируется по возрастанию ключей и сначала обрабатывается words[1], потом words[4], words[5].

Можно как-то этого избежать?
Спасибо за внимание.

B@rmaley.e><e 02.12.2010 13:13

Цитата:

Сообщение от nibble
{"4": "who", "1": "are", "5": "you"}

Это ни разу не массив. Отсюда и все проблемы.

nibble 02.12.2010 13:17

Объект? Его ведь всё равно можно условно назвать ассоциативным массивом.
Если бы индексы были не числовыми, обход был бы в нужном порядке. Но у меня весь остальной код рассчитан на то, что обращение к нему будет по числовому id.

B@rmaley.e><e 02.12.2010 13:26

А в объектах правильный порядок (даже тот, что задан инициализацией) вообще не гарантируется.

Aetae 02.12.2010 13:35

Хз, у меня всё работает.
<script>
var words={"4": "who ", "1": "are ", "5": "you "}
for (var i in words) { document.write(words[i]) }
</script>

nibble 02.12.2010 13:41

У меня сработало только в Safari. В Опере и Хроме "are who you".
Раз стандартом ничего не гарантируется, то на это не стоит рассчитывать.

Похоже, придётся делать ещё один массив, где будут в нужном порядке указаны ключи для ассоциативного. Другого выхода нет?

monolithed 02.12.2010 13:44

Цитата:

Сообщение от B@rmaley.e><e
А в объектах правильный порядок (даже тот, что задан инициализацией) вообще не гарантируется.

в массивах при переборе элементов циклом for/in тоже не гарантируется

Aetae 02.12.2010 14:00

Скажите зачем оно надо, возможно есть решение проще.)

B@rmaley.e><e 02.12.2010 14:20

Цитата:

Сообщение от monolithed
в массивах при переборе элементов циклом for/in тоже не гарантируется

Учитывая, что массивы - те же объекты...
В случае с массивами правильный порядок достигается тем, что индексы в правильном порядке перебираем мы сами (i = 0; i < n; ++i), а не движок (как в случае с for ... in ...)

nibble 02.12.2010 14:41

Серверная часть сортирует предложения (товары) и пишет в <script> массив вида "4321":{"display":0,"data":{данные о товаре}}.
Посетитель выбирает разные фильтры, производит какие-то действия, на их основании скрипт выставляет флаги display.
Потом нужные данные загружаются Аяксом и их нужно отобразить в списке <ul>.
Для этого я и иду циклом for, и добавляю предложение в ul, если display==1. Важно, чтобы в ul они появились в отсортированном сервером порядке.
Мне было удобно, что к массиву можно обращаться по id товара. Весь код так написан.
У меня в профиле ссылка на сайт. Пока временно решил проблему, добавив к ключам букву "o". И каждый раз при обращении к массиву пишу offers["o"+id], а в цикле for, чтобы получить id пишу i.replace("o", ""). И мне это не нравится...


Часовой пояс GMT +3, время: 15:45.