Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.12.2010, 13:12
Новичок на форуме
Отправить личное сообщение для nibble Посмотреть профиль Найти все сообщения от nibble
 
Регистрация: 02.12.2010
Сообщений: 6

Обход массива в строгом порядке
В ходе разработки получился массив-объект с числовыми ключами. К примеру, такой:
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].

Можно как-то этого избежать?
Спасибо за внимание.
Ответить с цитированием
  #2 (permalink)  
Старый 02.12.2010, 13:13
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от nibble
{"4": "who", "1": "are", "5": "you"}
Это ни разу не массив. Отсюда и все проблемы.
Ответить с цитированием
  #3 (permalink)  
Старый 02.12.2010, 13:17
Новичок на форуме
Отправить личное сообщение для nibble Посмотреть профиль Найти все сообщения от nibble
 
Регистрация: 02.12.2010
Сообщений: 6

Объект? Его ведь всё равно можно условно назвать ассоциативным массивом.
Если бы индексы были не числовыми, обход был бы в нужном порядке. Но у меня весь остальной код рассчитан на то, что обращение к нему будет по числовому id.
Ответить с цитированием
  #4 (permalink)  
Старый 02.12.2010, 13:26
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

А в объектах правильный порядок (даже тот, что задан инициализацией) вообще не гарантируется.
Ответить с цитированием
  #5 (permalink)  
Старый 02.12.2010, 13:35
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,586

Хз, у меня всё работает.
<script>
var words={"4": "who ", "1": "are ", "5": "you "}
for (var i in words) { document.write(words[i]) }
</script>
Ответить с цитированием
  #6 (permalink)  
Старый 02.12.2010, 13:41
Новичок на форуме
Отправить личное сообщение для nibble Посмотреть профиль Найти все сообщения от nibble
 
Регистрация: 02.12.2010
Сообщений: 6

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

Похоже, придётся делать ещё один массив, где будут в нужном порядке указаны ключи для ассоциативного. Другого выхода нет?
Ответить с цитированием
  #7 (permalink)  
Старый 02.12.2010, 13:44
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от B@rmaley.e><e
А в объектах правильный порядок (даже тот, что задан инициализацией) вообще не гарантируется.
в массивах при переборе элементов циклом for/in тоже не гарантируется
Ответить с цитированием
  #8 (permalink)  
Старый 02.12.2010, 14:00
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,586

Скажите зачем оно надо, возможно есть решение проще.)
Ответить с цитированием
  #9 (permalink)  
Старый 02.12.2010, 14:20
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от monolithed
в массивах при переборе элементов циклом for/in тоже не гарантируется
Учитывая, что массивы - те же объекты...
В случае с массивами правильный порядок достигается тем, что индексы в правильном порядке перебираем мы сами (i = 0; i < n; ++i), а не движок (как в случае с for ... in ...)
Ответить с цитированием
  #10 (permalink)  
Старый 02.12.2010, 14:41
Новичок на форуме
Отправить личное сообщение для nibble Посмотреть профиль Найти все сообщения от nibble
 
Регистрация: 02.12.2010
Сообщений: 6

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как проверить название массива? Andrej_2 Общие вопросы Javascript 2 30.06.2010 21:07
Помогите разобраться с повторением при генерации массива (Javascript) JsLoveR Javascript под браузер 4 16.12.2009 15:26
Можно ли как для произвольного массива создавать вызовы функций , имеющих на входе kefi Общие вопросы Javascript 3 17.04.2009 16:53
вставка элементов массива в текстовую форму по клику olezyk Общие вопросы Javascript 3 21.03.2009 22:01