Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> for…in и пользовательские объекты 
:(
    Опции темы
Sardar
Дата 21.4.2005, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



К сожалению не кривых ассоциативных массивов в JS нет(в JScript есть словарь ;-) ), другими словами любой обьект есть ассоциативный массив, но ни один из его ключей не должен совпадать с базовым интерфейсом обьекта. Например ключь toString запрещён.  Но нет проблем если мы сделаем пару get/set методов, а все ключи будем писать с уникальным префиксом:

Простая реализация за 5 минут:
Код
function HashMap() {
  len=0;
  this.getLength=function() {
    return len;
  }
  this.set=function(key, value) {
     if(typeof(this["~"+key])=="undefined") len++;  
     this["~"+key]=value;
  }
  this.remove=function(key) {
     if(typeof(this["~"+key])!="undefined") {
       len--
       delete this["~"+key];
       return true;
     } else return false;
  }
}
HashMap.prototype.get=function(key) {
  return this["~"+key]||null;
}
HashMap.prototype.getKeys=function() {
  var ret=[];
  for(var i in this) {
    if(i.charAt(0)=="~") ret[ret.length]=i.substr(1);
  }
  return ret;
}
HashMap.prototype.getValues=function() {
  var ret=[];
  for(var i in this)
    if(i.charAt(0)=="~") ret[ret.length]=this[i];
  return ret;
}

var a=new HashMap();
a.set("test", "ura");
a.set("test2", 24);
alert(a.getLength());
a.remove("bla");
a.remove("test");
alert(a.getLength());
alert(a.get("test")+", "+a.get("test2"));
a.set("vingrad", "http://forum.vingrad.ru");
alert(a.getKeys());
alert(a.getValues());


Длинна (len) это приватное поле, не доступное извне. Оно лежит в контексте конструктора, потому методы что его используют тоже обьявленны в конструкторе. Технически на каждый обьект создаётся своя копия метода, что хавает чуть больше памяти. Практически нам на это по барабану smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0703 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.