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", ""). И мне это не нравится...

nibble 02.12.2010 14:44

Сделаю массив order=["3674", "1834", "4561"...]
и при выводе предложений буду идти по этому массиву с помощью (i = 0; i < n; ++i), а нужное предложение находить через offres[ order[i] ] .
По-моему, самое нормальное.
Всем спасибо.

dmitriymar 02.12.2010 22:22

очередной велосипед
Цитата:

Сообщение от nibble
Серверная часть сортирует предложения (товары) и пишет в <script>

. зачем писать в скрипт если можно просто передать отфильтрованные данные.
Цитата:

Сообщение от nibble
Серверная часть сортирует предложения (товары) и пишет в <script>

никогда не слышал что можно создавать скрипт динамически на сервере

monolithed 02.12.2010 22:31

Цитата:

Сообщение от dmitriymar
никогда не слышал что можно создавать скрипт динамически на сервере

видимо вы плохо знакомы с серверными языками

dmitriymar 02.12.2010 22:44

Цитата:

Сообщение от monolithed
видимо вы плохо знакомы с серверными языками

не отрицаю.
а можно в двух словах об этом механизме?

dmitriymar 02.12.2010 22:53

я конечно понимаю что я могу переписать данные в файл присвоить ему расширение js. но я могу сделать все эти действия с помощью ехе файла . не думал что рнр может подобное

Kolyaj 02.12.2010 22:55

Цитата:

Сообщение от dmitriymar
но я могу сделать все эти действия с помощью ехе файла . не думал что рнр может подобное

Что подобное? В файл писать? Так PHP никто ещё не обижал.

Цитата:

Сообщение от dmitriymar
присвоить ему расширение js

Расширение необязательно. Да и в файл записывать необязательно.

dmitriymar 02.12.2010 23:00

Хорошо поставлю вопрос по другому. в скрипте чтобы подрузить js скрипт необходимо знать его адрес-т.е он должен быть создан и сохранён на сервере. так отсюда два вопроса как в скрипте можно подгрузить динамический скрипт какой не имеет адреса. и второй какой в этом случае механизм формирования скрипта на сервере.

monolithed 02.12.2010 23:48

Цитата:

Сообщение от dmitriymar
а можно в двух словах об этом механизме?

Ну алгоритм примерно такой:
<?php
$filedir = end(glob('www/path/*.js', GLOB_NOSORT)); //путь к файлу
if(file_exists($filedir)){ //проверяем есть ли уже такой файл
    unlink($filedir); //если есть удаляем
    if(!file_exists($filedir)){ //если удалили - создаем
        $create = fopen('www/path/script.js', "w");
        fwrite($create, 'alert(true);'); // пишем значение в файл
        fclose($create);//закрываем дескриптор файла
    }
}
//добавляем в документ
echo '<script type=\"text\/javascript\" src=\"'.$filedir.'"><\/script>';
?>

nibble 03.12.2010 08:34

Цитата:

Сообщение от dmitriymar (Сообщение 82050)
зачем писать в скрипт если можно просто передать отфильтрованные данные

Часть товаров передаётся сразу, но большая часть будет подгружаться аяксом только в случае необходимости. И содержимое ul будет в реальном времени меняться в зависимости от действий посетителя.

Генерировать яваскрипт на php вообще никакой проблемы. Зачем создавать файлы?
echo '<script type="text/javascript">alert(true);</script>';

dmitriymar 03.12.2010 09:59

monolithed,
Спс.
nibble, не сохраняякак ты обратишся к файлу скрипта?

Kolyaj 03.12.2010 10:04

dmitriymar,
путь на сайте не обязательно файл. Весь сайт (включая картинки, стили и скрипты) может вообще из одного файла состоять.

monolithed 03.12.2010 10:52

Kolyaj ну мы же знаем что так лучше не делать))

dmitriymar 03.12.2010 10:53

момент с одним файлом ясен. не ясно вот этот момент получения скрипта нового из javascript без записи этого скрипта в каталог сервера

monolithed 03.12.2010 10:58

Цитата:

Сообщение от dmitriymar
момент с одним файлом ясен. не ясно вот этот момент получения скрипта нового из javascript без записи этого скрипта в каталог сервера

Чего?

dmitriymar 03.12.2010 11:13

та есть там прикол-таже интравеб. конечно не имеет никакого отношения к скрипту. интересовал ответ на этот вопрос.
Цитата:

Сообщение от Kolyaj
путь на сайте не обязательно файл. Весь сайт (включая картинки, стили и скрипты) может вообще из одного файла состоять

и как обратиться к файлу скрипта на клиенте средствами скрипта без записи файла скрипта на сервер

Kolyaj 03.12.2010 11:14

Цитата:

Сообщение от monolithed
Kolyaj ну мы же знаем что так лучше не делать))

Ну мы же знаем, что бывают ситуации, когда это надо :)
Функция phpinfo, например.

dmitriymar,
у вас в голове слишком сильная связь "адрес на сайте-путь к файлу". Эта связь существует (не у вас в голове, а вообще) потому, что веб-серверу так легче объяснять, что отдавать на различные запросы.
Вообще говоря, необязательно где-то там должен присутствовать какой-то файл. Браузер вообще ничего о сервере не знает, ему всё равно, какие там на сервере файлы.

Kolyaj 03.12.2010 11:19

Цитата:

Сообщение от dmitriymar
и как обратиться к файлу скрипта на клиенте средствами скрипта без записи файла скрипта на сервер

Госпади, какая каша в голове.

<?php
if ($_GET['js']) {
    echo "alert(1);";
} else {
?>
<html>
<head>
    <script src="?js=1"></script>
</head>
<body></body>
</html>
<?php } ?>

dmitriymar 03.12.2010 11:58

всёттаки у клиента средствами рнр а не javascript информация получаеться. а я спрашивал как средствами только скрипта получить не сохранённый на сервере скрипт.

Kolyaj 03.12.2010 12:14

JavaScript тоже на сервере может выполняться.

dmitriymar 03.12.2010 12:20

я это знаю-но для этого нужен сервер с поддержкой яваскрипта. вопрос был о клиенте и о средствах скрипта

Kolyaj 03.12.2010 12:32

Тогда это вообще глупо: если скрипт генерируется на клиенте, то он там же и выполняется, зачем какие-то пути на сервере задавать, если сервер не участвует в процессе?

dmitriymar 03.12.2010 12:36

перичатай тему.сам ведь задал что на сервере скрипт не обязательно сохранять.

Kolyaj 03.12.2010 12:47

Не обязательно сохранять, его можно там генерировать в момент запроса.

dmitriymar 03.12.2010 12:59

это ясно. момент в том можноли его получать и работать с ним средствами javascript без рнр
если я правильно понял то конструкция с подгружаемым скриптом в варианте просто запроса скрипта по его адресу с клиента не пройдёт -в этом варианте идет обращение именно к сохранённому на сервере скрипту.Мне непонятен сам запрос с клиента в этом случае скриптом .

monolithed 03.12.2010 13:36

dmitriymar Мы (не)создаем отдельный файл с расширением js, ложем его в к.л. каталог и подключаем этот файл ( к примеру в index.php)

т.е. на выходе в исходном коде страницы сайт будет красоваться дескриптор script или к.л. другой.
Тот файл, что мы создали и подключили сценарий может меняться как угодно и когда когда угодно, а может и не меняться что тут не ясно?

dmitriymar 03.12.2010 13:38

Вот в таком виде ясно


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