>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Многомерный ассоциативный массив. Область действия. http://forum.mozilla-russia.org/viewtopic.php?id=21162 |
Орец > 22-01-2008 17:41:40 |
Задача.
Код вне функций: Функция: Выделить код Код:function ff_kbd_items(stroka) { //alert("Функция работает"); var textitems = window.getBrowser().contentDocument.body.innerHTML; // Записываем текст страницы в переменную /* var fileIn = DirIO. get ("TmpD"); fileIn. append ("ff_site.txt"); var stroka = FileIO.read(fileIn, "windows-1251"); // читает файл */ var sstroka = ''; var myArray=stroka.split(","); ff_string = new Array(); for (var j = 0; j < (myArray.length); j++) {ff_string["+myArray[j]+"] = new Array();} //-без подобной конструкции многомерный массив совсем не создавался. //Проверка на наличие совпадений for (var j = 0; j < (myArray.length); j++) { var reg='id=(\\d+)">'+myArray[j]+'</a> \\((\\d+)\\)'; var result1, result, re; re=new RegExp (reg,"ig"); result1=textitems.match(re); if (result1 !=null)//Если совпадения есть, продолжаем. { re=new RegExp (reg,"i"); result=textitems.match(re); sstroka=sstroka+myArray[j]+"|"+result[2]+"|"+result[1]+"\r\n"; //ff_string["+myArray[j]+"] = new Array();//- без этой строки не создавался массив, но потом проделал тоже самое со всеми строками в отдельном цикле(выше). Опасаясь, что причина в затирании созданных строк. ff_string["+myArray[j]+"][0]= [result[2], result[1]]; for (var i = 0; i < result1.length; i++) { re=RegExp (reg,"i"); result=RegExp.rightContext.match(re); if (result ==null){alert('Массив '+myArray[j]+':\n'+ff_string["+myArray[j]+"]);break;} // Тут выводит строку массива sstroka=sstroka+myArray[j]+"|"+result[2]+"|"+result[1]+"\r\n"; var k = 1+i; ff_string["+myArray[j]+"][k]= [result[2], result[1]]; } } }//закрывается проверка массива alert("Поиск завершён: \n"+sstroka); var fileIn = DirIO. get ("TmpD"); fileIn. append ("ff_items.txt"); var rv = FileIO.write(fileIn, sstroka, "w", "windows-1251"); alert('Файл создан: ' + rv); ff_string.sort(); } Код кнопки вызова: Выделить код Код:alert("Весь массив: "+ff_string); alert("Строка массива: "+ff_string["Джугашв"]); alert("Ячейка массива: "+ff_string["Джугашв"][2]); |
Shutnik > 22-01-2008 18:27:34 |
ассоциативный массив можно задать так: |
Anton > 22-01-2008 18:42:36 |
интересная конструкция. это чтобы bbcode на форуме обойти, или так и есть на самом деле ? |
Орец > 22-01-2008 22:27:12 |
Так и есть на самом деле. Вначале я сделал так как ты советуешь - не работает. shutnik |
Shutnik > 23-01-2008 07:05:26 |
Орец |
Орец > 23-01-2008 09:49:08 |
shutnik пишет
Хорошо, смысл в том чтобы с загруженной странички взять подходящие под регулярное выражение данные. Причём те из них что соответствуют переданным функции названиям. Т.е. берётся из ссылки id и индикатор оставшихся использований и вместе с наименованием получаемым в качестве параметра функции записывается в файл и параллельно в матрицу. Выделить код Код:<td><a href="http://visit.net/servis/items.php?id=533526">Джугашв</a> (8)</td> <td><a href="http://visit.net/servis/items.php?id=533724">Джугашв</a> (60)</td> <td><a href="http://visit.net/servis/items.php?id=533913">Джугашв</a> (54)</td> <td><a href="http://visit.net/servis/items.php?id=718742">Лакер М</a> (30)</td> <td><a href="http://visit.net/servis/items.php?id=718743">Лакер</a> (19)</td> ff_kbd_items |
Anton > 23-01-2008 14:19:12 |
Орец
Ты прям как тот самый канадский программист : ) Этот код создаёт у ff_string свойство с названием "+myArray[j]+"]. Все создаваемые массивы последовательно ему присваиваются этому свойству, когда цикл завершается, значением этого свойства является последний созданный массив. И заполучить его значение можно только опять же через ff_string["+myArray[j]+"] и никак иначе.
|
Shutnik > 23-01-2008 15:02:15 |
у меня получился такой код: Выделить код Код:<script> var ff_string = []; function ff_kbd_items (stroka) { var textitems = '<td><a href="http://visit.net/servis/items.php?id=533526">Джугашв</a> (8)</td>\n<td><a href="http://visit.net/servis/items.php?id=533724">Джугашв</a> (60)</td>\n<td><a href="http://visit.net/servis/items.php?id=533913">Джугашв</a> (54)</td>\n<td><a href="http://visit.net/servis/items.php?id=718742">Лакер М</a> (30)</td>\n<td><a href="http://visit.net/servis/items.php?id=718743">Лакер</a> (19)</td>'; stroka = stroka.split(','); for (var j = 0; j < stroka.length; j++) { ff_string[stroka[j]] = []; var reg_str = 'id=([0-9]+)">' + stroka[j] + '</a> \\(([0-9]+)\\)'; var reg_exp = new RegExp (reg_str, 'ig'); var result = textitems.match(reg_exp); if (result != null) for (var i = 0; i < result.length; i++) { reg_exp = RegExp (reg_str, "i"); var result2 = result[i].match(reg_exp); ff_string[stroka[j]][i + 1] = [result2[2], result2[1]]; } } ff_string.sort(); } function dump(arr,level) { var dumped_text = ""; if(!level) level = 0; var level_padding = ""; for(var j=0;j<level+1;j++) level_padding += " "; if(typeof(arr) == 'object') { for(var item in arr) { var value = arr[item]; if(typeof(value) == 'object') { dumped_text += level_padding + "'" + item + "' ...\n"; dumped_text += dump(value,level+1); } else { dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n"; } } } else { dumped_text = "===>"+arr+"<===("+typeof(arr)+")"; } return dumped_text; } ff_kbd_items("Джугашв,Лакер М,Лакер"); alert(dump(ff_string)); </script> |
Орец > 23-01-2008 15:49:27 |
Anton Впрочем сейчас я думаю что просто забывал исправить там где объявлял, а заменял только на заполнении матрицы. shutnik |
Anton > 23-01-2008 17:44:37 |
Она производится как ей и полагается. Но метод sort предназначен для массивов, а не для хэшей. |
Infocatcher > 23-01-2008 18:46:57 |
Я делал так: Выделить код Код:var vals = []; var map = {}; var val; for(var i = 0; i < ...; i++) { val = ...; if(!map[val]) map[val] = [val]; // поскольку значения val могут совпадать, делаем массив else map[val].push(val); // разумеется, вместо "= [val]" и ".push(val)" может быть все, что угодно – вместо val, то есть vals.push(val); } vals.sort(); // vals.reverse(); for(var i = 0; i < vals.length; i++) { map[vals[i]].shift() // ... } |
Орец > 23-01-2008 22:27:25 |
Не знаю как насчёт хешей, но на моей исправленной функции со вложенным массивом работает, если в качестве параметра сортировки указать функцию sortiruem, а там указать столбец массива по которому должно сравнивать Выделить код Код:function sortiruem(a, b) {return a[0] - b[0];} ... ff_string[myArray[j]].sort(sortiruem); ... |
Anton > 24-01-2008 00:25:15 |
А знать надо, раз уж мы решили наполнять его произвольными свойствами, а потом пытаться вызывать встроенный метод.
Так она сортирует вложенные массивы. И для вложенных массивов незачем городить огород с пользовательской функцией сортировки, вполне достаточно |
Орец > 24-01-2008 00:36:20 |
Anton пишет
Нет, так уж получилось что: сортировал их
Что меня не устраивало. И пришлось использовать свою функция для этого |
Anton > 24-01-2008 00:46:09 |
а конструкция стала от этого более полезной ? |
Орец > 24-01-2008 09:51:22 |
Anton пишет
Нет, я же написал что с ней не работало |