Страницы: 1
Задача.
Матрица к строкам которой можно обращаться использую символьные названия, создаётся внутри функции, но нужна в глобальном доступе.
С обычным массивом проблем нет, определил его вне функций и после того как функция его заполнена - доступен всем.
Но для использования требуется многомерный ассоциативный массив. Чтобы обращаться к ячейкам можно было в виде Matrica["Буровая"][0][1]
И если после заполнения первой строки можно к ней обращаться и получать результат, то уже по окончанию заполнения обратиться нельзя.
Возможно я просто неправильно создаю многомерный ассоциативный массив. Что я делаю не верно?
Матрица должна иметь вид:
Матрица должна иметь вид:
Имя1=>
0 - [1, 2]
1 - [1, 2]
3 - [1, 2]
Имя2=>
0 - [1, 2]
1 - [1, 2]
3 - [1, 2]
..........
Имяn=>
0 - [1, 2]
1 - [1, 2]
3 - [1, 2]
Код вне функций:
Функция:
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]);
Отредактировано Орец (23-01-2008 09:50:43)
Отсутствует
ассоциативный массив можно задать так:
Отсутствует
интересная конструкция. это чтобы bbcode на форуме обойти, или так и есть на самом деле ?
по-моему, должно быть так:
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
интересная конструкция. это чтобы bbcode на форуме обойти, или так и есть на самом деле ?
по-моему, должно быть так:
Так и есть на самом деле. Вначале я сделал так как ты советуешь - не работает.
shutnik
Интересно, но как это применить для заполнения в цикле пока не представляю.
Отсутствует
Орец
давай разбираться, смысл такого буддистского кода я понять не смог.
для начала укажи параметр, с которым вызывается функция ff_kbd_items и небольшой пример переменной textitems.
Отсутствует
Орец
давай разбираться, смысл такого буддистского кода я понять не смог.
для начала укажи параметр, с которым вызывается функция ff_kbd_items и небольшой пример переменной textitems.
Хорошо, смысл в том чтобы с загруженной странички взять подходящие под регулярное выражение данные. Причём те из них что соответствуют переданным функции названиям. Т.е. берётся из ссылки id и индикатор оставшихся использований и вместе с наименованием получаемым в качестве параметра функции записывается в файл и параллельно в матрицу.
Потом в матрице происходит сортировка. В результате которой первыми во вложенной матрице оказываются id у которых меньшие показания индикатора И следующая функция сможет брать из массива id, подставлять в другую ссылку и обращаться по ней к сайту с учётом индикатора, в случае когда индикатор доходит до 0 строка убирается из массива и происходит обращение к другим ссылкам с тем же именем.
В файл записывается на случай закрытия браузера, для возможности восстановления.
textitems
<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
Отсутствует
Орец
Так и есть на самом деле. Вначале я сделал так как ты советуешь - не работает.
Ты прям как тот самый канадский программист : )
Этот код создаёт у ff_string свойство с названием "+myArray[j]+"]. Все создаваемые массивы последовательно ему присваиваются этому свойству, когда цикл завершается, значением этого свойства является последний созданный массив. И заполучить его значение можно только опять же через ff_string["+myArray[j]+"] и никак иначе.
Теперь вот эта строчка:
Это что, глобальная переменная или невнимательность ? Моих скудных телепатических способностей не хватает, чтобы разобраться самому.Прошу прощения, моя )
Отредактировано Anton (23-01-2008 14:43:02)
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
у меня получился такой код:
<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>
Отсутствует
Anton
О чём-то таком смутно догадывался, но в той конструкции отказывалось работать в виде:
Впрочем сейчас я думаю что просто забывал исправить там где объявлял, а заменял только на заполнении матрицы.
shutnik
Спасибо за пример. Работает
Только осталось понять почему сортировка не производиться как по идее должно бы быть.
Отсутствует
почему сортировка не производиться
Она производится как ей и полагается. Но метод sort предназначен для массивов, а не для хэшей.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Но метод sort предназначен для массивов, а не для хэшей.
Я делал так:
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() // ... }
Отредактировано Infocatcher (23-01-2008 18:53:51)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Не знаю как насчёт хешей, но на моей исправленной функции со вложенным массивом работает, если в качестве параметра сортировки указать функцию sortiruem, а там указать столбец массива по которому должно сравнивать
правда сортировать надо по мере заполнения матрицы.
function sortiruem(a, b) {return a[0] - b[0];} ... ff_string[myArray[j]].sort(sortiruem); ...
Отредактировано Орец (23-01-2008 22:31:28)
Отсутствует
Не знаю как насчёт хешей
А знать надо, раз уж мы решили наполнять его произвольными свойствами, а потом пытаться вызывать встроенный метод.
Предлагаю для эксперимента обработать ссылку <a ...>sort</a>
но на моей исправленной функции со вложенным массивом работает, если в качестве параметра сортировки указать функцию sortiruem
Так она сортирует вложенные массивы. И для вложенных массивов незачем городить огород с пользовательской функцией сортировки, вполне достаточно
Отредактировано Anton (24-01-2008 00:25:58)
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
но на моей исправленной функции со вложенным массивом работает, если в качестве параметра сортировки указать функцию sortiruem
Так она сортирует вложенные массивы. И для вложенных массивов незачем городить огород с пользовательской функцией сортировки, вполне достаточно
Нет, так уж получилось что:
сортировал их
в лексикографическом порядке ("словарном порядке" или "порядке телефонной книги", а не в числовом порядке).Ссылка на справочник
Что меня не устраивало. И пришлось использовать свою функция для этого
Отсутствует
Что меня не устраивало. И пришлось использовать свою функция для этого
а конструкция
стала от этого более полезной ?
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
стала от этого более полезной ?
Нет, я же написал что с ней не работало
*Догадывается, что Антон хочет чего-то от него добиться, но чего именно...*
Отсутствует
Страницы: 1