Перебрать в цикле многомерный массив на JQuery
Отцы, помогайте. Я сервер-сайд недопрограммер. В JQuery полный пень, но стоит задача написать калькулятор для сайта доставки.
Пользователь задаёт вес и город доставки, к последнему привязана стоимость доставки и срок доставки. Как я понимаю, JQuery как таковой, многомерные массивы не поддерживает, поэтому, для создания подобного массива, нужно создать объект. Создал. var Towns = [{"Москва", 1000, 1 }, {"Урюпинск", 5000, 5}, {"Бобруйск", 3000, 3}] Получаю от пользователя переменную town == "Москва" Понимаю, чтобы извлечь значения привязанные к городу, нужно перебрать массив в цикле, найти массив, где 0 == "Москва" и взять элементы массива 1 и 2. И на этом мои познания синтаксиса обрываются :) Нашёл ответ, тему можно убивать. |
Цитата:
|
Цитата:
Отсюда делаю вывод - ты не верно понимаешь. |
arachnoz,
Такая запись базы не удобнее ? <script type="text/javascript"> var Towns = {Москва:[1000, 1], Урюпинск:[5000, 5], Бобруйск:[3000, 3]} alert(Towns.Москва); </script> |
Большое спасибо за ответы! И, кстати, хочу поблагодарить вас не только за ответы мне, но и вообще за ваши ответы на форуме - они мне не раз пригодились.
2 Ksa Наверняка я туплю, если бы я был мегаJSкодером, я вряд ли бы задавал здесь вопросы :) Однако, то, что Вы сможете увидеть ниже - в программировании называется объект, а не массив. 2 Deff За ночь я немного повысил свой JS - skill и даже написал полурабочий скрипт. База сделана сейчас таким образом: var twn ={ 'Абакан':{'tim':'9-12','pr1':3150,'pr2':90,'pr3':87,'pr4':83,'pr5':68,'pr6':65,'pr7':62}, 'Альметьевск':{'tim':'5-7','pr1':2520,'pr2':72,'pr3':69,'pr4':65,'pr5':53,'pr6':50,'pr7':47}}; И я могу вытащить из неё нужные параметры, используя название города как ключ массива. Типа: twn['Чебоксары']['pr7'] Однако, у меня возник вопрос с перебором всех городов в цикле, эта фишка нужна, потому, что я использую JQuery Autocomplete в форме ввода. Она принимает параметр сюда: $("#from").autocomplete({ source: одномерный массив }); И вооооот... :( Что туда подсунуть - я ума не приложу. |
Цитата:
Цитата:
Цитата:
http://javascript.ru/for..in |
2 Ksa - а Вы, батенька, буквоед :D
Большое спасибо за ответ, пойду ковырять! |
Цитата:
Если использовать слова без разбора - тебя вообще понимать перестанут... :( |
Это точно. Но вроде бы синтаксис PHP и JS - схожий с C :) Соответственно, и определения.
Я просто впервые столкнулся с объектами в таком виде %) Вот, наворотил БД - полное биде... Теперь думаю, как вообще обратиться к городу в моей импровизированной базе данных. Как к массиву не выходит twn [0] - выдаёт undefined. А как к чему? :D Как к объекту? for var ЧТО in twn :blink: И где смайл, с чуваком бьющимся о клаву? Он про меня. |
Постепенно осознаю, что я дебил и действительно нужно было сделать БД в виде указанном Deff. Тогда можно было бы обращаться по номеру элемента в массиве. Мне ведь и не нужны эти дополнительные значения переменных в массиве. И из Excel быбл бы проще делать БД - в csv перегнал и подправил синтаксис. :(
|
Для тех, кто следит за моими успехами :D
Привёл БД к такому состоянию: var twns ={ 'Абакан':['9-12',3150,90,87,83,68,65,62], 'Альметьевск':['5-7',2520,72,69,65,53,50,47]}; Но всё равно, не понимаю как перебрать города в цикле и что засунуть в Autocomplete... :no: |
var ALLarray ={ Абакан:['9-12',3150,90,87,83,68,65,62], Альметьевск:['5-7',2520,72,69,65,53,50,47], Тайшет:['5-7',2520,72,69,65,53,50,47], }; for(i in ALLarray){ alert('Это Альметьевск? = '+(i=='Альметьевск')) alert(i+':\n'+ALLarray[i]); } |
Переделал БД на
var twns ={ 'Абакан':['9-12',3150,90,87,83,68,65,62], 'Альметьевск':['5-7',2520,72,69,65,53,50,47]}; Но всё равно не догоняю, как обратиться к городу по порядковому номеру в ... объекте? |
Цитата:
|
Кроссбраузерно: (Если без старых ИЕ мон и без доп массива
SITYarr = ['Абакан','Альметьевск','Тайшет'] var ALLarray ={ Абакан:['9-12',3150,90,87,83,68,65,62], Альметьевск:['5-7',2520,72,69,65,53,50,47], Тайшет:['5-7',2520,72,69,65,53,50,47], }; alert("Выводим 1-й город:"+'\n'+SITYarr[0]+':\n'+ALLarray[SITYarr[0]]); for(i in ALLarray){ alert('Это Альметьевск? = '+(i=='Альметьевск')) alert(i+':\n'+ALLarray[i]); } |
Deff - спасибо большое за подсказки. Я по первости на форуме не увидел пейджера и постил два сообщения подряд :)
Дело в том, что Autocomplete принимает на вход простой одномерный массив вида ['Абакан', 'Альметьевск', 'И прочее']; Т.к. моя импровизированная БД уже содержит их, я хотел сформировать одномерный массив, выдрав ключи из многомерного. А все примеры, которые мне попались за пару дней гугления предполагают, что значение ключа известно. |
А если название города будет например Нижний новгород?
|
Тогда autocomplete вернёт false.
|
Тем не менее, всё равно туповато выходит у меня.
Конструкция var twns ={ 'Абакан':['9-12',3150,90,87,83,68,65,62], 'Альметьевск':['5-7',2520,72,69,65,53,50,47], 'Анапа':['4-5',2170,62,60,56,45,42,39]}; for(i in twns){ alert(i+':\n'+twns[i]);} Выводит по очереди все массивы, содержащиеся в объекте. Я правильно выражаюсь? :) Это же объект? Соответственно, напрямую получить название города я не могу. Вариант - в этом же цикле парсить каждый массив и отделять ключ. Или регуляркой его порвать и загнать в другой массив. Такие мысли. |
Снова нашёл решение на этом чудо-форуме, на этот раз тут :)
|
arachnoz,
Я же привел в пост 15 кроссбраузерный вариант со вторым массивом ключей перебираете массив ключей по ключу получаете его подмассив есть варианты с indexOf массивов - но не кроссбраузерно и запутаетесь еще более, поскольку исходную структуру нун тады переделать Оптимально 1-м массивом объекта всегда иметь сам массив ключей |
Deff - да, спасибо, я уже понял, что более короткого пути нет :)
|
arachnoz,
Есть, - есть - но спешить не стоит - это понятный, не сильно увеличивает контент и универсальный, Есть и короче |
В итоге, решил всё вот так.
$(function() { var towns = [ ]; \\ простой массив, передающийся в autocomplete for(i in twns) \\ обходим БД { towns[towns.length]=new Array(i); \\ наполняем массив } $("#from").autocomplete({ source: towns }); \\ передаём в autocomplete $("#to").autocomplete({ source: towns }); alert(towns); }); И что бы вы думали она сказала? Да у тебя же мама педагог... (с) В общем, autocomlpete сказала - хер вам. Окошко выводит с подсказками и даже, судя по сокращению его размеров при вводе городов, выводит города, но только названий их нет :) При том, что если вручную сформировать для неё массив вида towns = ['город', 'другой город']; - всё прекрасно выводится. Алерт при этом сгенеренный массив выводит нормально. Никто не сталкивался с такой бедой? :( |
Поставил Firebug и посмотрел, что выводится. Понял причину.
Фигня в том, что массив у меня получается такого вида, [['город'], ['другой город']] а мне нужно передать в autocomplete ['город', 'другой город'] Подскажите, как обратиться избавиться от лишних скобок в выводе. |
похоже, что надо сделать нормальный массив :) можно скопировать.
|
melky - к сожалению, я не в силах оценить Ваш юмор, т.к. даже не могу понять, чем не нормален этот массив :)
Я пытался сделать из массива строку при помощи join, но, соответственно, autocomplete не хочет принимать строку. Хочу сказать спасибо разработчикам JQuery за два потраченных дня, мне кажется, я бы уже сам написал autocomplete для этого калькулятора за это время. |
Цитата:
Ну косинус же! (с) var twns ={ 'Абакан':['9-12',3150,90,87,83,68,65,62], 'Альметьевск':['5-7',2520,72,69,65,53,50,47], 'Анапа':['4-5',2170,62,60,56,45,42,39] }; for(i in twns){ alert(i); }; |
2 ksa - спасибо большое, это я уже догнал и реализовал. Но теперь я собираю это неправильно в массив :)
|
Цитата:
|
Да вот, блин, я не могу понять, откуда он собирается неправильно. По идее-то одномерный массив должен формироваться... :(
var twns ={ 'Абакан':['9-12',3150,90,87,83,68,65,62], 'Альметьевск':['5-7',2520,72,69,65,53,50,47], 'Анапа':['4-5',2170,62,60,56,45,42,39]}; newarr = []; for(i in twns){ newarr[newarr.length]=new Array(i); } alert(newarr); |
Всё, я догнал :) Я задвоил массив тут:
var twns ={ 'Абакан':['9-12',3150,90,87,83,68,65,62], 'Альметьевск':['5-7',2520,72,69,65,53,50,47], 'Анапа':['4-5',2170,62,60,56,45,42,39]}; newarr = []; for(i in twns){ newarr[newarr.length]=new Array(i); } alert(newarr); В итоге опять многомерный собирал. Правильный вариант: var twns ={ 'Абакан':['9-12',3150,90,87,83,68,65,62], 'Альметьевск':['5-7',2520,72,69,65,53,50,47], 'Анапа':['4-5',2170,62,60,56,45,42,39]}; newarr = []; for(i in twns){ newarr[newarr.length]= i; } alert(newarr); Всё заработало, спасибо за помощь! К сожалению, пока не могу поднять вам карму, говорит, что я должен ещё кому-то её поднять для начала :) Но, похоже, я здесь не последний раз :D |
Цитата:
|
Часовой пояс GMT +3, время: 06:22. |