Главная
Простейшие операторы
Операторы условия
Циклы
Массивы
Массивы II
Строки
Функции I
Функции II
|
Дополнительные методы и свойства для массивов
Не расстраивайтесь, если что-то кажется вам непонятным и запутанным, впереди
еще немало упражнений, а, как известно, на практике дело познается проще.
JavaScript несложный язык, но возможности его очень ограничены. Например, у
него нет полной поддержки двумерных массивов. Но зато для одномерных
массивов JavaScript предлагает методы и свойства, редкие для других языков
программирования. На этом уроке они (методы и свойства, а не языки) и будут
рассмотрены. А с одним из свойств вы уже знакомы - length, которое
определяет количество элементов массива. А вот доступные методы:
concat(). Объединяет два массива в один. Например, необходимо, чтобы три
элемента массива ввел пользователь, а еще три определила программа. Конечно,
можно обойтись и одним массивом, но можно сделать и так:
-
<script>
var a=new Array(3), b=new Array(3);
for (i=0; i<3; ++i) {
a[i]=prompt("Введите элемент массива");
}
for (i=0; i<3; ++i) {
b[i]=Math.round(Math.random()*10);
}
c=a.concat(b); //вот он, этот самый concat
alert("a: "+a); //выведем все три массива, чтобы посмотреть, что получилось
alert("b: "+b);
alert("c: "+c);
</script>
Элементы массива b добавились в конец массива a, при этом исходные массивы
остались без изменений
pop(). Удаляет последний элемент массива. В следующей программе мы удалим
последний элемент, если тот окажется меньше нуля
-
<script>
var a=new Array();
for (i=0; i<100; ++i) {
a[i]=prompt("Введите элемент массива (последний раз введите отрицательное
число)", "");
if (a[i]<0) {break} /*если пользователь ввел отрицательное число, прервем
цикл, предварительно удалив этот символ из массива*/
}
alert("Сейчас в нашем массиве "+a.length+" элементов, и последний элемент
равен "+a[a.length-1]);
if (a[a.length-1]<0) {a.pop();} //в принципе, условие здесь лишнее:
последний элемент, благодаря предыдущему циклу, всегда будет отрицателен
alert("Теперь в нашем массиве "+a.length+" элементов, и последний элемент
равен "+a[a.length-1]);
x=a.pop();
alert("Теперь в нашем массиве "+a.length+" элементов, и последний элемент
равен "+a[a.length-1]+". А последний раз мы удалили "+x);
</script>
Чувствую, я переборщил с примером. Ну, ничего разберем его последовательно.
Для начала обратите внимание на ввод массива. Он прерывается после введения
отрицательного числа. Чтобы прервать цикл, мы использовали уже знакомый
оператор break.
Также мы использовали новый вид комментария (/* */). Такой вид позволяет
организовать многострочные комментарии, а также показать, где именно
заканчивается комментарий.
Чтобы показать действия метода pop(), мы несколько раз выводили длину
массива и его последний элемент на экран. Загадка: "Почему, чтобы вывести
последний элемент, надо написать alert(a[a.length-1]), откуда взялась эта
-1?". Загадка была несложной? Потому что, нумерация элементов массива
начинается с нуля, и если в массиве 10 элементов, то последний будет иметь
номер 9.
И осталась последняя особенность. Удалять элемент массива можно просто (a.pop()),
а можно с присвоением к какой-либо переменной (x=a.pop()).
shift(). Удаляет первый элемент массива (можно с присвоением к.-либо
переменной). Например: a.shift(); x=a.shift(). Если массив состояли из
элементов 1; 2; 3; 4; 5, то после таких преобразований он станет равным 3;
4; 5, а переменная x примет значение 2.
slice(). Извлекает часть массива. Работает этот метод так: a.slice(x, y),
где вместо x ставится номер элемента, с которого следует начать извлекать
элементы, а вместо y можно ничего не писать (будут извлечены все элементы до
конца массива), а можно поставить номер элемента, перед которым следует
закончить извлечение.
Упражнение 20
Массив из десяти чисел заполняется пользователем. На экран вывести другой
массив из трех элементов: ближайшего к началу отрицательного элемента и его
окружающих.
<script>
var a=new Array(10), b=new Array(3);
for (i=0; i<10; ++i) {
a[i]=prompt("Введите элемент массива. Пожалуйста, хотя бы один раз введите
отрицательное число");
};
for (i=0; i<10; ++i) {
if (a[i]<0) {b=a.slice(i-1, i+2); break;} //получили 3 элемента: a[i-1];
a[i]; a[i+1]
} //break был использован на тот случай, если в массиве будет несколько
отрицательных чисел
alert(b);
</script>
splice(). Заменяет часть массива на другие элементы. Похож на предыдущий:
a.splice(x, i, ...). Вместо x - элемент, с которого следует начинать замену;
вмест i - количество заменяемых элементов; вместо многоточия через запятую
новые элементы (их количество не должно превышать i). Например:
<script>
var a=new Array(10);
for (i=0; i<10; ++i) {
a[i]=i+1;
};
b=a.splice(2, 3, "a", "b", "c"); //если не присваивать данное свойство др.
переменной, исходные элементы потеряются
alert("a: "+a);
alert("b: "+b);
</script>
Упражнение 21
Заменить в массиве из 10-ти введенных пользователем чисел, все отрицательные
числа на противоположные. Данное свойство не работает в браузере Netscape
Navigator
push(). Добавляет элементы в конец массива. Допустим, нам необходимо
добавить в конец массива три символа - первые буквы фамилии, имени, отчества
программиста (то бишь, себя):
-
<script>
var a=new Array(5);
for (i=0; i<5; ++i) {a[i]=Math.round(Math.random()*10)}
b=a.push("А", "К", "О");
alert("a: "+a);
alert("b: "+b);
</script>
Как видите, переменная b - не массив, а число, соответствующее длине
массива.
unshift(). То же самое, только добавляет элементы в начало массива.
-
reverse(). Изменяет порядок элементов на противоположный. Например, в
зависимости от желания пользователя, вывести десять последовательных
натуральных чисел в порядке возрастания или убывания:
-
<script>
var a=new Array(10);
for (i=0; i<10; ++i) {a[i]=i+1}
poryadok=confirm("Вывести натуральные числа в порядке возрастания?");
if (poryadok) {alert(a)}
else {b=a.reverse(); alert("a: "+a); alert("b: "+b)}
</script>
Массивы a и b после применения reverse() оказались одинаковыми (10, 9, 8, 7,
6, 5, 4, 3, 2, 1), то есть данный метод, независимо присвоен он какой-либо
переменной или нет, меняет порядок элементов в исходном массиве.
toString(). Составляет строку из всех элементов массива, разделенных
запятой:
-
<script>
var a=new Array(1, 2, 3);
s=a.toString();
alert(typeof(a)+" a: "+a);
alert(typeof(s)+" s: "+s);
</script>
join(). Аналогичен предыдущему методу, но позволяет добавить вид
разделителя:
-
<script>
var a=new Array(1, 2, 3);
var a=new Array(1, 2, 3);
s=a.join("+");
alert(typeof(a)+" a: "+a);
alert(typeof(s)+" s: "+s);
alert(s+"="+(a[0]+a[1]+a[2]));
</script>
Почти всеми этими методами вы могли воспользоваться и ранее, используя
циклы, оператор присваивания (=) и т.д. и т.п. Упражнение 22*
Последовательность 011212201220200112202... строиться следующим образом:
сначала пишется 0, затем повторяется следующее действие: уже написанную
часть приписывают справа с заменой 0 на 1, 1 на 2, 2 на 0. Требуется
написать программу, которая по введенному натуральному n определит, какое
число стоит на n-ом месте в этой последовательности, удалит его и выведет на
экран.
[В начало]
|