Массивы
|
Автор: Артемьев Сергей Игоревич ICQ: 438856621 email: _spin_@bk.ru |
Как и большинство языков программирования, JavaScript предоставляет средство для работы с формализованными данными большого объема - массивы. Массив - это список переменных, к каждой из которых можно получить доступ по её номеру. Массив создаётся следующим образом:
// создание пустого массива
// задание значений первых двух элементов
var myArray = new Array()
myArray[0] = 'Москва'
myArray[1] = 'Хабаровск'
// создание нового массива
// и резервирование места для
// 100 переменных
var myArray = new Array(100)
// создание нового массива
// и явная инициализация первого элемента
var myArray = new Array('Элемент');
// косвенное создание массива
// из двух элменетов
var myArray = ['первый элемент', 'второй элемент']
Все массивы, независимо от способа создания, представляют собой экземпляры класса (объекта) Array. Добавление элементов производится простой инициализацией соответствующего элемента.
var myArray = new Array() myArray[0] = 'Питер'
Массивы в JavaScript не обязательно должны быть "сплошными", т.е. содержать все элементы. При необходимости можно создавать так называемые "разреженные" массивы:
var myArray = new Array(); myArray[0] = 'Питер' // пропустим myArray[1] myArray[2] = 'Гомель' // пропустим myArray[3] myArray[4] = 'Рязань' myArray[5] = 'Псков' for(i = 0; i < 6; i++) alert(myArray[i])
Этот код создаёт массив и заполняет только необходимые элементы. Теперь если мы попробуем получить значение не инициализированного элемента (в примере это первый и третий), то получим "undefined". Использование разреженных массивов иногда очень удобно, но требует опыта и внимательности, поэтому на начальном этапе лучше от них отказаться. Кроме того, разреженные массивы не дают выгоды по использованию памяти, т.к. место резервируется для всех элементов, в том числе не инициализированных.
Элементами массива могут быть переменные любого типа. Интересная особенность JavaScript - массив может одновременно содержать элементы различных типов, в том числе массивы:
//
// массив с элементами разных типов
//
var myArrayS = new Array();
myArrayS[0] = 'Ярославль';
myArrayS[1] = 10000;
myArrayS[2] = 'Ямал';
myArrayS[3] = 5000;
for(i = 0; i < myArrayS.length; i += 2)
alert('Город: ' + myArrayS[i] + '\n' +
'Население: ' + myArrayS[i + 1] + '\n')
//
// массив с элементами-массивами
//
var myArrayA = new Array()
myArrayA[0] = new Array('Ярославль', 10000);
myArrayA[1] = new Array('Ставрополь', 5000);
for(i = 0; i < myArrayA.length; i++)
alert('Город: ' + myArrayA[i][0] + '\n' +
'Население: ' + myArrayA[i][1] + '\n')
Класс Array содержит единственное свойство - length, позволяющее узнать текущую длину массива:
var myArray = new Array(); ... // узнать колиекчтво элементов alert(myArray.length) // добавить эдемент последним myArray[myArray.length] = 'последнее значение'
Обратите внимание, что значение Array.length на единицу больше номера последнего элемента массива, т.к. нумерация в массиве начинается с нуля, а свойство length показывает общее количество элементов.
Класс Array так же содержит ряд методов, существенно упрощающих некоторые рутинные операции с массивами:
| Array.join() | Получение списка элементов массива в виде одной строки без разделителей. |
| Array.join(разделитель) | Получение списка элементов массива в виде одной строки, причем элементы массива разделены строкой "разделитель" |
| Array.reverse() | Изменение порядка сортировки массива. Этот метод "переворачитвает" массив: первый элемент становится последним и наоборот. |
| Array.sort() | Сортировка массива по алфавиту. Если массив содержит числовые данные, то при сортировке используются их строковые представления. |
| Array.sort(функция_сортировки) | Сортировка массива по пользовательскому критерию, который задаётся с помощью собственной функции сортировки: |
Рассмотрим небольшой пример:
// функция сортировки массива
function sortByLength(a, b)
{
if(a.length > b.length) return 1;
else
if(a.length = b.length) return 0;
else return -1;
}
// инициализация массива
var myArray = new Array()
myArray[0] = 'Ярославль'
myArray[1] = 'Ямал'
myArray[2] = 'Ставрополь'
myArray[3] = 'Омск'
myArray[4] = 'Анапа'
alert('исходный массив:\n\n' + myArray.join('\n'))
// сортируем по алфавиту
myArray.sort();
alert('сортированный по алфавиту:\n\n' + myArray.join('\n'))
// сортируем в обратном порядке
myArray.reverse();
alert('перевёрнутый:\n\n' + myArray.join('\n'))
// сортируем по длине с помощью собственной функции
myArray.sort(sortByLength);
alert('сортированный по длине:\n\n' + myArray.join('\n'))
Как видите, пользоваться методами массива очень просто. Самое интересное в этом примере - функция сортировки. Она должна всегда иметь два параметра и возвращать число. Порядок сортировки определяется знаком возвращаемого числа. Если число отрицательное - первый аргумент должен в массиве располагаться раньше второго, если положительное - позже. Если элементы равны, то обычно возвращается ноль, а порядок элементов не изменяется.
В JavaScript1.1 и выше реализованы дополнительные свойства и методы массивов, расширяющие возможности для программистов. Например, добавлены методы concat() и slice(), позволяющие собъединить массивы и получить кусок массива соответственно. К сожалению, ещё не все браузеры поддерживают JavaScript1.1 и JavaScript1.2, поэтому при разработке кроссбраузерных скриптов использовать новые нестандартные свойства и методы надо очень аккуратно.
Таким образом, массивы - это один из наиболее гибких и удобных механизмов JavaScript, т.к. позволяет с лёгкостью манипулировать даже относительно большими объемами данных. Массивы надо использовать везде, где заранее неизвестно количество хранимых данных и их тип.
С другой стороны, увлекаться и делать массивы из одного-двух элементов тоже не стоит. Перед созданием массива подумайте, а точно ли он нужен? Как показывает практика - в половине случаев проще обойтись двумя лишними переменными.