Начав вкратце с небольшого сравнения хэшей и массивов, хочется продолжить более детальным их описанием. Здесь я хочу написать о массивах и методах, которыми можно с ними работать. О хэшах я тоже напишу и опять буду пытаться противопоставлять их массивам.
Для начала пара слов о хэшах
Несмотря на то, что мне умные люди подсказывают, что хэши – это не есть хэши, я пока буду продолжать именовать «это» именно хэшами. Однако советую прислушаться к тем, что говорит что хэшей как таковых в JavaScript нет. На самом деле хэш, о котором я талдычу – по сути есть объект. Не некий специализированный объект, а объект, как базовый класс, на идиологии которого стоится чуть ли не все в JavaScript.
Почему я использую этот неуклюжий термин? Все просто – это единственный способ, который я знаю, дабы создать некий ассоциативный массив. А хэш – короткое слово, которое удобно использовать. В то же время я очень не хочу использовать для обозначения объектов, используемых исключительно в качестве ассоциативных массивов, бо это может запутать читателя. Я не хочу чтобы это читали запутанные читатели – на меня и так жалуются что я излагаю свою мысли слишком путанно.
Продолжим про массивы
Массив – это тоже базовый класс в JavaScript. Однако по идеологии JavaScript он тоже представляет из собой объект. Для вкуривших ООП можно сказать что массив – наследует свойства объекта. Хотя насколько это так – я е знаю. Вполне могу и ошибаться в деталях.
Массив, будучи объектом, имеет свойства и методы. Они и позволяют взаимодействовать с ним, решая множество повседневных задач. Методы и свойства исполняют роль ту роль, что в функциональных языках играют функции. К примеру вместо функции sizeof() будет использованj свойство length:
// Так делается в PHP sizeof( $array )
// Аналогичный функционал в JavaScript array.length
Копнем поглубже в массивы
Если попробовать разобраться в таком звере, как массив, можно уже с первых шагов нарыть столько интересного, что хватит на пару месяцев для разбора. Массивы содержат в себе не только значения но и несколько десятков методов, позволяющих работать с содержимым массивов. Я не буду останавливаться на всех них подробно. Бо есть множество других сайтов, что делают это. В качестве примера могу привести вот этот справочник, которым и сам изредка пользуюсь.
Таким образом перебор массива, его сортировка, вычисление длины и прочие стандартные операции совершенно спокойно выполняются с помощью внутренних методов массива. С той-же лёгкостью с помощью массивов эмулируются очередь и стек.
А теперь посмотрим в хэши
А здесь у нас ситуация гораздо хуже. Т.к. хэш представляет собой голый объект – у него нету никаких методов. В нем есть только то, что было в него засунуто в процессе жизни. Это достаточно сильно осложняет работу с ними.
Но решения есть.
Первое решение. Оно попроще. Можно сделать несколько самописных функций для подсчёта длины хэша, для поиска по хэшу, для сортировки. Все они в том или ином виде будут использовать перебор хэша. К примеру навскидку мне приходят следующие строки, которые некогда использовались в некоторых моих проектах.
// Эта функция позволяет узнать пуст ли хэш или нет
function hashIsEmpty(hash)
{
for( var k in hash ) // Перебираем хэш, полученный нами в параметрах.
return false // Если в нем есть хоть один элемент - возвращаем что хэш не пуст
return true // иначе же это вообще не хэш или же пустой хэш
}
// Эта функция позволяет узнать длину хэша
function hashLength(hash)
{
var counter = 0; // Иницилизируем счетчик
for( var k in hash ) // Перебираем хэш, полученный нами в параметрах.
counter++ // Считаем очередной элемент
return counter // Возвращаем сколько насчитали
}
Хочу оговориться, что эти функции просты для безобразия. И возможно могут не работать с хэшами, что имеют несколько более сложный формат, нежели представленный в предыдущей моей заметке про массивы и хэши.
Второе решение посложнее, но зато и красивее. Если очень нужен полноценный функционал ассоциативного массива – можно создать объект, в котором будут методы для работы с ассоциативными ключами.
Но про это я буду писать позже поскольку тема достаточно сложна для освоения. Пока же могу посоветовать разобраться в таких вещах как prototype.js или jQuery. Что-то мне подсказывает, что в них уже может содержаться подобный функционал.
24.08.2009 в 20:41
Вопрос: как можно сделать ссылку на свойство хеша в декларации хеша?
т.е. что-то типа
var hash = {foo: 111, bar: hash.foo};
Вот еще пример:
return {
base: «http://xxxx»,
a: base + «y»
}
06.09.2009 в 06:14
Боюсь что из этого ничего не получится.
На момент обращения к хэшу – он еще не существует.
т.е. сие придется реализовывать через отдельную переменную.