3 января 2009

Начав вкратце с небольшого сравнения хэшей и массивов, хочется продолжить более детальным их описанием. Здесь я хочу написать о массивах и методах, которыми можно с ними работать. О хэшах я тоже напишу и опять буду пытаться противопоставлять их массивам.

Для начала пара слов о хэшах

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

Возможно это тоже будет интересно
2 комментария

2 комментария на запись “JavaScript. Хэши и массивы – копаем дальше.”

  1. Alexander пишет:

    Вопрос: как можно сделать ссылку на свойство хеша в декларации хеша?
    т.е. что-то типа
    var hash = {foo: 111, bar: hash.foo};

    Вот еще пример:
    return {
    base: «http://xxxx»,
    a: base + «y»
    }

  2. nekt пишет:

    Боюсь что из этого ничего не получится.

    На момент обращения к хэшу – он еще не существует.

    т.е. сие придется реализовывать через отдельную переменную.

Оставить комментарий