Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Перебрать в цикле многомерный массив на JQuery (https://javascript.ru/forum/jquery/29387-perebrat-v-cikle-mnogomernyjj-massiv-na-jquery.html)

arachnoz 26.06.2012 01:20

Перебрать в цикле многомерный массив на JQuery
 
Отцы, помогайте. Я сервер-сайд недопрограммер. В JQuery полный пень, но стоит задача написать калькулятор для сайта доставки.

Пользователь задаёт вес и город доставки, к последнему привязана стоимость доставки и срок доставки.

Как я понимаю, JQuery как таковой, многомерные массивы не поддерживает, поэтому, для создания подобного массива, нужно создать объект.

Создал.

var Towns = [{"Москва", 1000, 1 }, {"Урюпинск", 5000, 5}, {"Бобруйск", 3000, 3}]


Получаю от пользователя переменную town == "Москва"

Понимаю, чтобы извлечь значения привязанные к городу, нужно перебрать массив в цикле, найти массив, где 0 == "Москва" и взять элементы массива 1 и 2. И на этом мои познания синтаксиса обрываются :)

Поиском по форуму пользовался, и что-то без результатов вообще. Может само определение "многомерный массив" неверно?

Нашёл ответ, тему можно убивать.

ksa 26.06.2012 11:17

Цитата:

Сообщение от arachnoz
{"Москва", 1000, 1 }

Что это такое?

ksa 26.06.2012 11:20

Цитата:

Сообщение от arachnoz
Как я понимаю, JQuery как таковой, многомерные массивы не поддерживает

В JS можно создавать и обрабатывать многомерные массивы... JQuery написан на JS...
Отсюда делаю вывод - ты не верно понимаешь.

Deff 26.06.2012 15:04

arachnoz,
Такая запись базы не удобнее ?

<script type="text/javascript">
var Towns = {Москва:[1000, 1], Урюпинск:[5000, 5], Бобруйск:[3000, 3]}

alert(Towns.Москва);
</script>

arachnoz 26.06.2012 20:12

Большое спасибо за ответы! И, кстати, хочу поблагодарить вас не только за ответы мне, но и вообще за ваши ответы на форуме - они мне не раз пригодились.

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: одномерный массив
  });


И вооооот... :( Что туда подсунуть - я ума не приложу.

ksa 26.06.2012 20:17

Цитата:

Сообщение от arachnoz
Однако, то, что Вы сможете увидеть ниже - в программировании называется объект, а не массив.

Я спросил про то, что процитировал из твоего сообщения. Это вообще не понятно что... :)
Цитата:

Сообщение от arachnoz
используя название города как ключ массива

Это уже не массив. А таки объект. :)
Цитата:

Сообщение от arachnoz
у меня возник вопрос с перебором всех городов в цикле

Перебрать все свойства объекта может
http://javascript.ru/for..in

arachnoz 26.06.2012 20:25

2 Ksa - а Вы, батенька, буквоед :D

Большое спасибо за ответ, пойду ковырять!

ksa 26.06.2012 20:30

Цитата:

Сообщение от arachnoz
а Вы, батенька, буквоед

Когда пишешь на нескольких языках сразу ооочень важно чтобы тебя понимали и те и другие.
Если использовать слова без разбора - тебя вообще понимать перестанут... :(

arachnoz 26.06.2012 20:37

Это точно. Но вроде бы синтаксис PHP и JS - схожий с C :) Соответственно, и определения.

Я просто впервые столкнулся с объектами в таком виде %) Вот, наворотил БД - полное биде... Теперь думаю, как вообще обратиться к городу в моей импровизированной базе данных.

Как к массиву не выходит twn [0] - выдаёт undefined. А как к чему? :D

Как к объекту?
for var ЧТО in twn


:blink: И где смайл, с чуваком бьющимся о клаву? Он про меня.

arachnoz 26.06.2012 20:44

Постепенно осознаю, что я дебил и действительно нужно было сделать БД в виде указанном Deff. Тогда можно было бы обращаться по номеру элемента в массиве. Мне ведь и не нужны эти дополнительные значения переменных в массиве. И из Excel быбл бы проще делать БД - в csv перегнал и подправил синтаксис. :(

arachnoz 26.06.2012 21:24

Для тех, кто следит за моими успехами :D
Привёл БД к такому состоянию:
var twns ={
'Абакан':['9-12',3150,90,87,83,68,65,62],
'Альметьевск':['5-7',2520,72,69,65,53,50,47]};


Но всё равно, не понимаю как перебрать города в цикле и что засунуть в Autocomplete... :no:

Deff 26.06.2012 22:01

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]);
}

arachnoz 26.06.2012 22:29

Переделал БД на
var twns ={
'Абакан':['9-12',3150,90,87,83,68,65,62],
'Альметьевск':['5-7',2520,72,69,65,53,50,47]};

Но всё равно не догоняю, как обратиться к городу по порядковому номеру в ... объекте?

Deff 26.06.2012 22:40

Цитата:

Сообщение от arachnoz
Но всё равно не догоняю, как обратиться к городу по порядковому номеру в ... объекте?

:) А смысл ?

Deff 26.06.2012 22:44

Кроссбраузерно: (Если без старых ИЕ мон и без доп массива
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]);
}

arachnoz 26.06.2012 22:58

Deff - спасибо большое за подсказки. Я по первости на форуме не увидел пейджера и постил два сообщения подряд :)


Дело в том, что Autocomplete принимает на вход простой одномерный массив вида
['Абакан', 'Альметьевск', 'И прочее'];

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

zebra 26.06.2012 23:19

А если название города будет например Нижний новгород?

arachnoz 26.06.2012 23:23

Тогда autocomplete вернёт false.

arachnoz 26.06.2012 23:29

Тем не менее, всё равно туповато выходит у меня.

Конструкция

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 26.06.2012 23:37

Снова нашёл решение на этом чудо-форуме, на этот раз тут :)

Deff 26.06.2012 23:41

arachnoz,
Я же привел в пост 15 кроссбраузерный вариант со вторым массивом ключей
перебираете массив ключей по ключу получаете его подмассив

есть варианты с indexOf массивов - но не кроссбраузерно и запутаетесь еще более, поскольку исходную структуру нун тады переделать
Оптимально
1-м массивом объекта всегда иметь сам массив ключей

arachnoz 26.06.2012 23:56

Deff - да, спасибо, я уже понял, что более короткого пути нет :)

Deff 27.06.2012 00:19

arachnoz,
Есть, - есть - но спешить не стоит - это понятный, не сильно увеличивает контент и универсальный,

Есть и короче

arachnoz 27.06.2012 03:21

В итоге, решил всё вот так.

$(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 = ['город', 'другой город'];


- всё прекрасно выводится. Алерт при этом сгенеренный массив выводит нормально. Никто не сталкивался с такой бедой? :(

arachnoz 27.06.2012 12:31

Поставил Firebug и посмотрел, что выводится. Понял причину.

Фигня в том, что массив у меня получается такого вида,

[['город'], ['другой город']]


а мне нужно передать в autocomplete

['город', 'другой город']


Подскажите, как обратиться избавиться от лишних скобок в выводе.

melky 27.06.2012 12:48

похоже, что надо сделать нормальный массив :) можно скопировать.

arachnoz 27.06.2012 12:57

melky - к сожалению, я не в силах оценить Ваш юмор, т.к. даже не могу понять, чем не нормален этот массив :)
Я пытался сделать из массива строку при помощи join, но, соответственно, autocomplete не хочет принимать строку. Хочу сказать спасибо разработчикам JQuery за два потраченных дня, мне кажется, я бы уже сам написал autocomplete для этого калькулятора за это время.

ksa 27.06.2012 12:58

Цитата:

Сообщение от arachnoz (Сообщение 184442)
Конструкция

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]);}


Выводит по очереди все массивы, содержащиеся в объекте. Я правильно выражаюсь? :) Это же объект?
Соответственно, напрямую получить название города я не могу.

Как это не могу? :blink:
Ну косинус же! (с)
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);
};

arachnoz 27.06.2012 13:03

2 ksa - спасибо большое, это я уже догнал и реализовал. Но теперь я собираю это неправильно в массив :)

ksa 27.06.2012 13:05

Цитата:

Сообщение от arachnoz
Но теперь я собираю это неправильно в массив

Значит пора таки "собрать" правильно :)

arachnoz 27.06.2012 13:08

Да вот, блин, я не могу понять, откуда он собирается неправильно. По идее-то одномерный массив должен формироваться... :(

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);

arachnoz 27.06.2012 13:16

Всё, я догнал :) Я задвоил массив тут:

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

ksa 27.06.2012 13:19

Цитата:

Сообщение от arachnoz
Всё заработало, спасибо за помощь!

Фух... :)


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