Полезная информация

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№122-01-2008 17:41:40

Орец
Участник
 
Группа: Members
Зарегистрирован: 18-08-2006
Сообщений: 84
UA: Firefox 2.0

Многомерный ассоциативный массив. Область действия.

Задача.
Матрица к строкам которой можно обращаться использую символьные названия, создаётся внутри функции, но нужна в глобальном доступе.
С обычным массивом проблем нет, определил его вне функций и после того как функция его заполнена - доступен всем.
Но для использования требуется многомерный ассоциативный массив. Чтобы обращаться к ячейкам можно было в виде 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]

Код вне функций:

Выделить код

Код:

var ff_string = new Array();

Функция:

Выделить код

Код:

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)

Отсутствует

 

№222-01-2008 18:27:34

Shutnik
Участник
 
Группа: Extensions
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Firefox 2.0

Re: Многомерный ассоциативный массив. Область действия.

ассоциативный массив можно задать так:

Выделить код

Код:

var a = {
'foo' : {2 : 'a', 8 : 'b'},
'bar' : {3 : 'c', 5 : 'd'}
};

Отсутствует

 

№322-01-2008 18:42:36

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Многомерный ассоциативный массив. Область действия.

Выделить код

Код:

ff_string["+myArray[j]+"]

интересная конструкция. это чтобы bbcode на форуме обойти, или так и есть на самом деле ?
по-моему, должно быть так:

Выделить код

Код:

ff_string[myArray[j]]

Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№422-01-2008 22:27:12

Орец
Участник
 
Группа: Members
Зарегистрирован: 18-08-2006
Сообщений: 84
UA: Firefox 2.0

Re: Многомерный ассоциативный массив. Область действия.

интересная конструкция. это чтобы bbcode на форуме обойти, или так и есть на самом деле ?
по-моему, должно быть так:

Так и есть на самом деле. Вначале я сделал так как ты советуешь - не работает.

shutnik
Интересно, но как это применить для заполнения в цикле пока не представляю.

Отсутствует

 

№523-01-2008 07:05:26

Shutnik
Участник
 
Группа: Extensions
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Firefox 2.0

Re: Многомерный ассоциативный массив. Область действия.

Орец
давай разбираться, смысл такого буддистского кода я понять не смог.
для начала укажи параметр, с которым вызывается функция ff_kbd_items и небольшой пример переменной textitems.

Отсутствует

 

№623-01-2008 09:49:08

Орец
Участник
 
Группа: Members
Зарегистрирован: 18-08-2006
Сообщений: 84
UA: Firefox 2.0

Re: Многомерный ассоциативный массив. Область действия.

shutnik пишет

Орец
давай разбираться, смысл такого буддистского кода я понять не смог.
для начала укажи параметр, с которым вызывается функция 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

Выделить код

Код:

Джугашв,Лакер М,Лакер

Отсутствует

 

№723-01-2008 14:19:12

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Многомерный ассоциативный массив. Область действия.

Орец

Так и есть на самом деле. Вначале я сделал так как ты советуешь - не работает.

Ты прям как тот самый канадский программист : )

Выделить код

Код:

ff_string["+myArray[j]+"&#93;

Этот код создаёт у ff_string свойство с названием "+myArray[j]+"]. Все создаваемые массивы последовательно ему присваиваются этому свойству, когда цикл завершается, значением этого свойства является последний созданный массив. И заполучить его значение можно только опять же через ff_string["+myArray[j]+"] и никак иначе.
Теперь вот эта строчка:

Выделить код

Код:

result1 = textitems. match (re);

Это что, глобальная переменная или невнимательность ? Моих скудных телепатических способностей не хватает, чтобы разобраться самому.Прошу прощения, моя )

Отредактировано Anton (23-01-2008 14:43:02)


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№823-01-2008 15:02:15

Shutnik
Участник
 
Группа: Extensions
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Firefox 2.0

Re: Многомерный ассоциативный массив. Область действия.

у меня получился такой код:

Выделить код

Код:

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

Отсутствует

 

№923-01-2008 15:49:27

Орец
Участник
 
Группа: Members
Зарегистрирован: 18-08-2006
Сообщений: 84
UA: Firefox 2.0

Re: Многомерный ассоциативный массив. Область действия.

Anton
О чём-то таком смутно догадывался, но в той конструкции отказывалось работать в виде:

Выделить код

Код:

ff_string[myArray[j]]

Впрочем сейчас я думаю что просто забывал исправить там где объявлял, а заменял только на заполнении матрицы. :)

shutnik
Спасибо за пример. Работает :)
Только осталось понять почему сортировка не производиться как по идее должно бы быть. :(

Отсутствует

 

№1023-01-2008 17:44:37

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Многомерный ассоциативный массив. Область действия.

почему сортировка не производиться

Она производится как ей и полагается. Но метод sort предназначен для массивов, а не для хэшей.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№1123-01-2008 18:46:57

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Re: Многомерный ассоциативный массив. Область действия.

Но метод 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)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1223-01-2008 22:27:25

Орец
Участник
 
Группа: Members
Зарегистрирован: 18-08-2006
Сообщений: 84
UA: Firefox 2.0

Re: Многомерный ассоциативный массив. Область действия.

Не знаю как насчёт хешей, но на моей исправленной функции со вложенным массивом работает, если в качестве параметра сортировки указать функцию sortiruem, а там указать столбец массива по которому должно сравнивать :)
правда сортировать надо по мере заполнения матрицы.

Выделить код

Код:

function sortiruem(a, b) {return a[0] - b[0];}

...
ff_string[myArray[j]].sort(sortiruem);
...

Отредактировано Орец (23-01-2008 22:31:28)

Отсутствует

 

№1324-01-2008 00:25:15

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Многомерный ассоциативный массив. Область действия.

Не знаю как насчёт хешей

А знать надо, раз уж мы решили наполнять его произвольными свойствами, а потом пытаться вызывать встроенный метод.
Предлагаю для эксперимента обработать ссылку <a ...>sort</a>

но на моей исправленной функции со вложенным массивом работает, если в качестве параметра сортировки указать функцию sortiruem

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

Выделить код

Код:

ff_string[myArray[j]].sort();

Отредактировано Anton (24-01-2008 00:25:58)


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№1424-01-2008 00:36:20

Орец
Участник
 
Группа: Members
Зарегистрирован: 18-08-2006
Сообщений: 84
UA: Firefox 2.0

Re: Многомерный ассоциативный массив. Область действия.

Anton пишет

но на моей исправленной функции со вложенным массивом работает, если в качестве параметра сортировки указать функцию sortiruem

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

Выделить код

Код:

ff_string[myArray[j]].sort();

Нет, так уж получилось что:

Выделить код

Код:

ff_string[myArray[j]].sort();

сортировал их

в лексикографическом порядке ("словарном порядке" или "порядке телефонной книги", а не в числовом порядке).Ссылка на справочник

Что меня не устраивало. И пришлось использовать свою функция для этого ;)

Отсутствует

 

№1524-01-2008 00:46:09

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Многомерный ассоциативный массив. Область действия.

Что меня не устраивало. И пришлось использовать свою функция для этого

а конструкция

Выделить код

Код:

ff_string. sort ();

стала от этого более полезной ?


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№1624-01-2008 09:51:22

Орец
Участник
 
Группа: Members
Зарегистрирован: 18-08-2006
Сообщений: 84
UA: Firefox 2.0

Re: Многомерный ассоциативный массив. Область действия.

Anton пишет

стала от этого более полезной ?

Нет, я же написал что с ней не работало :)
*Догадывается, что Антон хочет чего-то от него добиться, но  чего именно...*

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]