Массивы

Обработка последовательностей элементов

Что такое массив?

  • массив это последовательность элементов
    • Порядок следования элементов фиксирован
    • Не имеют фиксированного размера
      • Можно получить текущий размер (Array.length)

  • Массив из 5 элементов
  • Индекс элемента - 3 array[3]
  • Елемент массива передан в переменную let a = array[3]

Обьявление массива

// Массив хранящий цифры
var numbers = [1, 2, 3, 4, 5];

// Массив хранящий строки
var weekDays = ['Понедельник', 'Вторник', 'Среда',
  'Четверг', 'Пятница', 'Суббота', 'Воскресенье']

// Массив хранящий различные типы
var mixedArr = [1, new Date(), 'привет'];

// Массив массивов (матрица)
var matrix = [
  ['0,0', '0,1', '0,2'],
  ['1,0', '1,1', '1,2'],
  ['2,0', '2,1', '2,2']];
  • Проинициализировать массив в JavaScript можно тремя способами:

    • Используя new Array(elements):

      var arr = new Array(1, 2, 3, 4, 5);
      
    • Используя new Array(initialLength):

      var arr = new Array(10);
      
    • Используя литерал массив (рекомендуется):

      var arr = [1, 2, 3, 4, 5];
      

In [1]:
var arr,
    arr2,
    weekDays,
    mixedArr;

arr = new Array(1, 2, 3, 4, 5);
console.log('arr = ' + arr.join(', '));

arr2 = new Array(10);
console.log('arr2 = ' + arr2.join(', '));
console.log('arr2[2] = ' + arr2[2]);

weekDays = ['Понедельник', 'Вторник', 'Среда','Четверг', 'Пятница', 'Суббота', 'Воскресенье']
console.log('weekDays = ' + weekDays.join(', '));

mixedArr = [1, new Date(), 'hello'];
console.log('mixedArr = ' + mixedArr.join(', '));


arr = 1, 2, 3, 4, 5
arr2 = , , , , , , , , , 
arr2[2] = undefined
weekDays = Понедельник, Вторник, Среда, Четверг, Пятница, Суббота, Воскресенье
mixedArr = 1, Tue Feb 21 2017 23:00:03 GMT+0300 (Russia TZ 2 Standard Time), hello
Out[1]:
undefined

Перевернуть массив


In [2]:
var array,
    length,
    reversed,
    index;

array = [1, 2, 3, 4, 5];

// Get array size
length = array.length;

// Declare and create the reversed array
reversed = new Array(length);

// Initialize the reversed array
for (index = 0; index < length; index++) {
    reversed[length - index - 1] = array[index];
}

console.log('array = [' + array.join(', ') + ']');
console.log('reversed = [' + reversed.join(', ') + ']');


array = [1, 2, 3, 4, 5]
reversed = [5, 4, 3, 2, 1]
Out[2]:
undefined

Как получить доступ к элементам массива?

  • Получить доступ к элементу массива можно с помошью индексного оператора: [] (квадратные скобки)
    • Индекс массива может быть в диапазоне [0; length-1]
    • Первый элемент массива 0
    • Последний элемент массива length-1
  • Массив элементов может быть сброшен или обновлен так - [] (индексный оператор)

In [2]:
var i, 
    capitals = ['Sofia', 'Washington', 'London', 'Paris'];

for (i in capitals) {
   console.log(capitals[i]);
}


Sofia
Washington
London
Paris
Out[2]:
undefined

Проход по массиву с помошью конструкции for

  • Используйте for для прохода по массиву, если Вам надо контролировать доступ к членам массива
  • В теле цикла используйте индекс по которому осуществляется доступ к элементу (array[index]):
var i, len;
for (i = 0, len = array.length; i < len; i += 1) {
   squares[i] = array[i] * array[i];
}
  • Распечатать элементы массива в обратном порядке:
var arr, i, len;
arr = [1, 2, 3, 4, 5];
for (len = arr.length, i = len - 1; i >= 0; i -= 1) {
    console.log(arr[i]);
}
// Результат: 5 4 3 2 1
  • Проинициализировать все элементы массива их индексом:
var i, len
for (i = 0, len = array.length; i < len; i += 1) {
    array[i] = i;
}

Проход по массиву с помошью цикла for-in

  • Как работает цикл for-in?
    • index интерация происходит по индексам всего массива
  • Используйте, когда индексы неизвестны
    • Доступ ко всем элементам осуществляется последовательно
    • Порядок не гарантируется
    • Подходит для работы с объектами
var index;
for (index in array) {
  // ваш код
}
  • Вывести построчно все элементы массива:
var capitals, i;
capitals = [
    'Sofia',
    'Washington',
    'London',
    'Paris'
];

for (i in capitals) {
    console.log(capitals[i]);
}

Добавлене и удаление элементов из массива

  • Все массивы в JavaScript являются динамическими

    • Их размер может меняться в процессе выполнения программы
    • В массив могут быть добавлены новые элементы
    • Из массива могут быть удалены любые элементы
  • Array#push(element)

    • Добавляет новый элемент в конец массива
  • Array#pop()

    • Удаляет элемент из конца массива
    • Возвращает удаленный элемент
  • Array#unshift(element)

    • Добавляет новый элемент в начало массива
  • Array#shift()
    • Удаляет элемент из начала массива
    • Возвращает удаленный элемент

In [3]:
var tail,
    head,
    numbers = [1, 2, 3, 4, 5];
console.log(numbers.join('|')); // result: 1|2|3|4|5

tail = numbers.pop();               // tail = 5;
console.log('Удалить: ' + tail);
console.log(numbers.join('|')); // result: 1|2|3|4

numbers.unshift(0);
console.log('Добавить 0 в начало массива (голову)');
console.log(numbers.join('|')); // result: 0|1|2|3|4

head = numbers.shift();         // head=0;
console.log('Удалить: ' + head);
console.log(numbers.join('|')); // result: 1|2|3|4


1|2|3|4|5
Удалить: 5
1|2|3|4
Добавить 0 в начало массива (голову)
0|1|2|3|4
Удалить: 0
1|2|3|4
Out[3]:
undefined

Сортировка массивов


In [4]:
var numbers = [5, 4, 23, 2];

function orderBy(a, b) {
    //return (a == b) ? 0 : (a > b) ? 1 : -1;
    return a - b;
};

numbers.sort();
console.log(numbers.join(', '));

numbers.sort(orderBy);
console.log(numbers.join(', '));
//returns 2, 4, 5, 23


2, 23, 4, 5
2, 4, 5, 23
Out[4]:
undefined

Методы массива

  • Array#reverse()

    • Переворачивает порядок элементов в массива
    • Возвращает новый массив
    var items = [1, 2, 3, 4, 5, 6];
    var reversed = items.reverse();
    //reversed = [6, 5, 4, 3, 2, 1]
    
  • Array#join(separator)

    • Поэлементная конкатенацияs всех элементов через разделитель
    • Возвращает строку
    var names = ["John", "Jane", "George", "Helen"];
    var namesString = names.join(", ");
    //namesString = "John, Jane, George, Helen"
    

Конкатенация массивов

  • arr1.concat(arr2)

    • Добавляет элементы массива arr2 в конец массива arr1
    • Возвращает новый массив
    • arr1 и arr2 остаются неизмененными!
    var arr1 = [1, 2, 3];
    var arr2 = ["one", "two", "three"];
    var result = arr1.concat(arr2);
    //result = [1, 2, 3, "one", "two", "three"]
    
  • Добавление элементов одного массива к другому массиву

    var arr1 = [1, 2, 3];
    var arr2 = ["one", "two", "three"];
    [].push.apply(arr1, arr2);
    //arr1 = [1, 2, 3, "one", "two", "three"]
    

Получение части массива

  • Array#slice(fromIndex [, toIndex])

    • Возвращает новый массив
      • Неполную копию части массива
    • Новый массив содержит элементы с fromIndex до to (исключая toIndex)
    • Может быть применимо для клонирования массива
    var items = [1, 2, 3, 4, 5];
    var part = items.slice(1, 3);
    //part = [2, 3]
    var clonedItems = items.slice();
    

Вставка в массив

  • Array#splice(index, count, elements)

    • Удаляет count элементов, начиная с index позиции
    • Добавляет elements с позиции index
    • Возвращает новый массив содержащий удаленные индексы
    var numbers = [1, 2, 3, 4, 5, 6, 7];
    var result = numbers.splice(3, 2, "four", "five", "five.five");
    //result = [4, 5]
    //numbers = [1, 2, 3, "four", "five", "five.five", 6, 7];
    
  • Удаление элементов по индексу из массива:

    //удалить один элемент с позиции `index`
    items.splice(index, 1);
    //удаляет count элементов начиная с позиции index
    items.splice(index, count);
    
  • Добавить элемент по индексу в массив:

    //Добавляет один элементт в позицию index
    items.splice(index, 0, element);
    //добавляет несколько элементов начиная с позиции index
    items.splice(index, 0, item1, item2, item3);
    

Поиск в массиве

  • Array#indexOf(element [, rightOf])
    • Возвращает индекс первого вхождения искомого значения в массиве
    • Возвращает -1 если элемент не найден
  • Array#lastIndexOf(element, [leftOf])
    • Возвращает индекс последнего вхождения искомого значения в массиве
    • Возвращает -1 если элемент не найден
  • Array#indexOf() и Array#lastIndexOf() работают в большинстве браузеров

Другие функции


In [5]:
var reversed,
    numbers2,
    allNumbers,
    deleted,
    i,
    even,
    numbers = [5, 4, 23, 2];

reversed = numbers.reverse();

console.log('[5, 4, 23, 2].reverse()');
reversed.forEach(function (item) {
    process.stdout.write(item + ", ");
});


[5, 4, 23, 2].reverse()
2, 23, 4, 5, 
Out[5]:
undefined

In [6]:
numbers2 = [1, 2, 3, 4, 5, 6];

console.log('[5, 4, 23, 2].concat([1, 2, 3, 4, 5, 6]):');

allNumbers = numbers.concat(numbers2);
allNumbers.forEach(function (item) {
    process.stdout.write(item + ", ");
});

console.log('numbers: ' + numbers);
deleted = numbers.splice(0, 2, 'one', 'two', 'three');

console.log('Удалить после [5, 4, 23, 2].splice(0, 2, "one", "two", "three"): ');
console.log('Элементы удалены: ' + deleted.join(', '));
console.log('Чисел после: ' + numbers.join(', '));


[5, 4, 23, 2].concat([1, 2, 3, 4, 5, 6]):
2, 23, 4, 5, 1, 2, 3, 4, 5, 6, numbers: 2,23,4,5
Удалить после [5, 4, 23, 2].splice(0, 2, "one", "two", "three"): 
Элементы удалены: 2, 23
Чисел после: one, two, three, 4, 5
Out[6]:
undefined

In [7]:
allNumbers = new Array();
for (i = 0; i < 20; i++) {
    allNumbers.push(i);
}

even = allNumbers.filter(function (item) {
    return item % 2 == 0;
});

console.log('После [1, 2, ...., 18, 19].filter(item%2==0):');
console.log(even.join(', '));


После [1, 2, ...., 18, 19].filter(item%2==0):
0, 2, 4, 6, 8, 10, 12, 14, 16, 18
Out[7]:
undefined

In [ ]: