- •1. Основные понятия
- •3.4.2. Окно с сообщением и кнопками ok и Cancel
- •3.4.3. Окно с полем ввода и кнопками ok и Cancel
- •3.6. Типы данных и инициализация переменных. Определение типа данных переменной
- •3.7. Операторы JavaScript
- •3.7.1. Математические операторы
- •3.7.2. Операторы присваивания
- •3.7.3. Двоичные операторы
- •3.7.4. Оператор обработки строк
- •3.8. Преобразование типов данных
- •3.9. Специальные символы. Разбиение сообщения в диалоговом окне на несколько строк
- •3.10. Массивы
- •3.11. Функции. Разделение программы на фрагменты
- •3.11.1. Основные понятия
- •3.11.2. Расположение функций внутри html-документа
- •3.11.3. Рекурсия. Вычисление факториала
- •3.11.4. Глобальные и локальные переменные
- •3.12. Условные операторы. Выполнение блоков кода только при соответствии условию
- •3.12.1. Операторы сравнения
- •3.12.2. Оператор ветвления if...Else. Проверка ввода пользователя
- •3.12.3. Оператор ? Проверка числа на четность
- •3.12.4. Оператор выбора switch
- •3.13. Операторы циклов. Многократное выполнение блока кода
- •3.13.1. Цикл for
- •3.13.2. Цикл while
- •3.13.3. Цикл do...While
- •3.13.4. Оператор continue.
- •3.13.5. Оператор break. Прерывание цикла
- •3.14. Ошибки в программе
- •3.14.1. Синтаксические ошибки
- •3.14.2. Логические ошибки
- •3.14.3. Ошибки времени выполнения
- •3.15. Встроенные классы JavaScript
- •3.15.1. Основные понятия
- •3.15.2. Класс Global
- •3.15.3. Класс Number. Работа с числами
- •3.15.4. Класс String. Обработка строк
- •3.15.5. Класс Array. Работа с массивами и их сортировка
- •Многомерные массивы
- •Ассоциативные массивы. Перебор ассоциативных массивов
- •3.15.6. Класс Math. Использование математических функций
- •3.15.7. Класс Date. Получение текущей даты и времени. Вывод даты и времени в окне Web-браузера
3.15.5. Класс Array. Работа с массивами и их сортировка
Класс Array позволяет создавать массивы как объекты и предоставляет доступ к множеству методов для обработки массивов. Экземпляр класса можно создать следующими способами:
Экземпляр класса> = new Array ([<Количество элементов массива>]);
Экземпляр класса> = new Array (Олементы массива через запятую>);
Если в круглых скобках нет никаких параметров, то создается массив нулевой длины, то есть массив, не содержащий элементов. Если указано одно число, то это число задает количество элементов массива. Если указано несколько элементов через запятую или единственное значение не является числом, то указанные значения записываются в создаваемый массив.
Обращение к элементам массива осуществляется с помощью квадратных скобок, в которых указывается индекс элемента. Индексация элементов массива начинается с нуля:
m_Mass = new Array("Один", "Два", "Три");
document.write(m_Mass[0]); // "Один"
m_Mass[3] = 4; // Создание нового элемента массива
Свойство length возвращает количество элементов массива:
m_Mass = new Array("Один", "Два", "Три");
document.write(m_Mass.length + "<BR>"); // 3
for (i=0; i<m_Mass.length; i++) {
document.write(m_Mass[i] + "<BR>");
// Выводим все элементы массива по одному на строку
}
Большое количество методов обеспечивают удобную работу с массивами:
push(<Список элементов>) добавляет в массив элементы, указанные в списке элементов. Элементы добавляются в конец массива. Метод возвращает новую длину массива:
m_Mass = new Array("Один", "Два", "Три");
document.write(m_Mass.push("Четвертый", "Пятый")); // 5
// "Один", "Два", "Три", "Четвертый", "Пятый"
unshift(<Список элементов>) добавляет в массив элементы, указанные списке элементов. Элементы добавляются в начало массива:
m_Mass = new Array("Один", "Два", "Три");
m_Mass.unshift("Четвертый", "Пятый");
// "Четвертый", "Пятый", "Один", "Два", "Три"
concat(<Список элементов>) возвращает массив, полученный в результате объединения текущего массива и списка элементов. При этом в текущий массив элементы из списка не добавляются:
m_Mass = new Array("Один", "Два", "Три");
m_Mass2 = new Array();
m_Mass2 = m_Mass.concat("Четвертый", "Пятый");
document.write(m_Mass2[4]); // "Пятый"
// m_Mass содержит "Один", "Два", "Три"
// m_Mass2 содержит "Один", "Два", "Три", "Четвертый", "Пятый"
join(<Разделитель>) возвращает строку, полученную в результате объединения всех элементов массива через разделитель:
m_Mass = new Array("Один", "Два", "Три");
var m_Str = m_Mass.join(" - ");
document.write(m_Str); // "Один – Два - Три"
shift() удаляет первый элемент массива и возвращает его:
m_Mass = new Array("Один", "Два", "Три");
document.write(m_Mass.shift()); // "Один"
document.write(m_Mass.join(", ")); // "Два, Три"
pop() удаляет последний элемент массива и возвращает его:
m_Mass = new Array("Один", "Два", "Три");
document.write(m_Mass.pop()); // "Три"
document.write(m_Mass.join(", ")); // "Один, Два"
sort ([Функция сортировки]) выполняет сортировку массива. Если функция не указана, будет выполнена обычная сортировка (числа сортируются возрастанию, а символы — по алфавиту):
m_Mass = new Array("Один", "Два", "Три");
m_Mass.sort();
document.write(m_Mass.join(", ")); // "Два, Один, Три"
Если нужно изменить стандартный порядок сортировки, это можно сделать с помощью функции сортировки. Функция принимает две переменные и должна возвращать:
-
1 — если первый больше второго;
-
-1 — если второй больше первого;
-
о — если элементы равны.
Например, стандартная сортировка зависит от регистра символов:
m_Mass = new Array("единица1", "Единый", "Единица2");
m_Mass.sort();
document.write(m_Mass.join(", ")); // "Единица2, Единый, единица1"
В результате мы получим неправильную сортировку, ведь "Единица2" и "Единый" должны стоять позже "единица!". Изменим стандартную сортировку на свою сортировку без учета регистра (листинг 3.25).
Листинг 3.25. Сортировка без учета регистра
function f_sort(m_Str1, m_Str2) { // Сортировка без учета регистра
m_Str1_1 = new String(m_Str1);
m_Str2_1 = new String(m_Str2);
m_Str1_1 = m_Str1_1.toLowerCase(); // Преобразуем к нижнему регистру
m_Str2_1 = m_Str2_1.toLowerCase(); // Преобразуем к нижнему регистру
if (m_Str1_1>m_Str2_1) return 1;
if (m_Str1_1<m_Str2_1) return -1;
return 0;
}
m_Mass = new Array("единица1", "Единый", "Единица2");
m_Mass.sort(f_sort); // Имя функции указывается без скобок
document.write(m_Mass.join(", ")); // "единица1, Единица2, Единый"
Для этого две переменные приводим к одному регистру, а затем производим стандартное сравнение. Обратите внимание, что мы не изменяем регистр самих элементов массива, так как работаем с их копиями.
Порядок сортировки можно изменить на противоположный (листинг 3.26), изменив возвращаемые функцией значения.
Листинг 3.26. Сортировка без учета регистра в обратном порядке
function f_sort(m_Str1, m_Str2) {
// Сортировка без учета регистра в обратном порядке
m_Str1_1 = new String(m_Str1);
m_Str2_1 = new String(m_Str2);
m_Str1_1 = m_Str1_1.toLowerCase(); // Преобразуем к нижнему регистру
m_Str2_1 = m_Str2_1.toLowerCase(); // Преобразуем к нижнему регистру
if (m_Str1_1>m_Str2_1) return -1;
if (m_Str1_1<m_Str2_1) return 1;
return 0;
}
m_Mass = new Array("единица1", "Единица2", "Единый");
m_Mass.sort(f_sort);
document.write(m_Mass.join(", ")); // "Единый, Единица2, единица1"
reverse () возвращает массив, элементы которого следуют в обратно: порядке относительно исходного массива. Метод reverse () переворачивает массив, а не сортирует элементы в обратном порядке;
m_Mass = new Array("Один", "Два", "Три");
m_Mass2 = new Array();
m_Mass2 = m_Mass.reverse();
document.write(m_Mass2.join(", ")); // "Три, Два, Один"
document.write(m_Mass.join(", ")); // "Три, Два, Один"
tostring() и valueOf() преобразуют массив в строку. Элементы указы ваются через запятую без пробела:
m_Mass = new Array("Один", "Два", "Три");
document.write(m_Mass.toString()); // "Один,Два,Три"
m_Mass = new Array("Один", "Два", "Три");
document.write(m_Mass.valueOf()); // "Один,Два,Три"