Урок 14. Приемы работы с массивами в JavaScript
Теория
Заполнение массивов
Заполнить массив 8 иксами (метод push):
var a=[];for(i=0;i<8;i++){a.push('x')}document.write(a)//Выведет ['x','x','x','x','x','x','x','x']
Заполнить массив числами от 1 до 8:
var a=[];for(i=1;i<=8;i++){a.push(i)}document.write(a)//Выведет [1,2,3,4,5,6,7,8]
Можно не использовать push, а указать ключи напрямую:
var a=[];for(i=0;i<8;i++){a[i]='x'}document.write(a)//Выведет ['x','x','x','x','x','x','x','x']
var a=[];for(i=0;i<8;i++){a[i]=i+1}document.write(a)//Выведет [1,2,3,4,5,6,7,8]
Переворот массива
Из массива ['a','b','c','d','e'] сделать ['e','d','c','b','a'].
Для этого перебрать исходный массив с конца и записать его элементы в новый массив. Они будут идти в обратном порядке:
a=['a','b','c','d','e'],r=[];for(i=a.length-1;i>=0;i--){r.push(a[i])}document.write(r)//Выведет ['e','d','c','b','a']
Переворот объекта
Поменять ключи и значения в объекте, например из {a:1,b:2,c:3,d:4,e:5} сделать {1:'a',2:'b',3:'c',4:'d',5:'e'}.
Для этого перебрать циклом for-in исходный объект и создать при этом новый объект r. Ключами нового объекта сделать элементы старого (это o[k]), а значениями нового объекта - ключи старого (это k):
o={a:1,b:2,c:3,d:4,e:5},r={};for(var k in o){r[o[k]]=k}console.log(r)//Выведет {1:'a',2:'b',3:'c',4:'d',5:'e'}
Подсчет количества элементов
Пусть дан массив ['a','b','c','a','a','b']. Сосчитать количество одинаковых элементов в этом массиве и сделать результат в виде объекта {a:3,b:2,c:1}.
Для решения сделаем объект c с начальным значением {a:0,b:0,c:0}. Будем перебирать массив циклом и увеличивать соответствующее значение в объекте c. К примеру: если текущий элемент массива - это 'a', то увеличить c['a'] на 1. Вот так: c['a']++.
Только вместо 'a' следует подставлять текущий элемент массива. Вот так: c[a[i]]++. Пишем окончательный код:
a=['a','b','c','a','a','b'],c={a:0,b:0,c:0};for(i=0;i<a.length;i++){c[a[i]]++}document.write(c)//Выведет {a:3,b:2,c:1}
Пойдем дальше: то, что объект c имеет изначальное значение {a:0,b:0,c:0} - это неудобно, т.к. неизвестно, какие элементы есть в массиве.
Пусть объект cформируется автоматически так: если такого элемента в c нет, то ему следует присвоить значение 1, а если есть, просто увеличить значение на 1:
a=['a','b','c','a','a','b'],c={};for(i=0;i<a.length;i++){if(c[a[i]]===undefined){c[a[i]]=1}else{c[a[i]]++}}console.log(c)//Выведет {a:3,b:2,c:1}
Перебор многомерных массивов
Есть 2-мерный массив: a=[[1,2,3],[4,5,6],[7,8]].
Вывести все его элементы, т.е. запустить 2 вложенных друг в друга цикла:
a=[[1,2,3],[4,5,6],[7,8]];for(i=0;i<a.length;i++){for(j=0;j<a[i].length;j++){document.write(a[i][j])}}
Практика
Задачи для решения
Заполнение массивов
Задача 1
Заполнить массив: в 1-й элемент записать 'x', во 2-й 'xx', в 3-й 'xxx' и т.д.
var a=[],s='x',q=s;for(i=1;i<=8;i++){a.push(s);s=s+q}document.write(a)
Задача 2
Заполнить массив: в 1-й элемент записать '1', во 2-й '22', в 3-й '333' и т.д.
Доделать!
Задача 3
Сделать функцию arrayFill, которая будет заполнять массив заданными значениями. 1-м параметром функция принимает значение, которым заполнять массив, а 2-м - сколько элементов должно быть в массиве. Пример: arrayFill('x',5) сделает массив ['x','x','x','x','x'].
Решение:
function arrayFill(value,length){var a=[];for(i=0;i<length;i++){a.push(value)}return a}console.log(arrayFill('x',5))
Задача 4
Дан массив с числами. Узнать, сколько элементов с начала массива надо сложить, чтобы в сумме получилось >10.
Переворот массива
Дан массив с числами. Не используя метода reverse, перевернуть его элементы в обратном порядке.
Многомерные массивы
Задача 1
Дан 2-мерный массив с числами, например [[1,2,3],[4,5],[6]]. Найти сумму элементов этого массива. Массив может быть произвольным.
Решение:
a=[[1,2,3],[4,5],[6]],s=0;for(i=0;i<a.length;i++){for(j=0;j<a[i].length;j++){s+=a[i][j]}}document.write(s)
Задача 2
Дан 3-мерный массив с числами, например [[[1,2],[3,4]],[[5,6],[7,8]]]. Найти сумму элементов этого массива. Массив может быть произвольным.
Решение:
a=[[[1,2],[3,4]],[[5,6],[7,8]]],s=0;for(i=0;i<a.length;i++){for(j=0;j<a[i].length;j++){for(k=0;k<a[i][j].length;k++){s+=a[i][j][k]}}}document.write(s)