Массивы — это контейнеры, которые хранят несколько значений в одной переменной в упорядоченном списке с индексом 0. Они могут содержать данные любого типа, включая числа, строки, объекты и даже другие массивы, и являются динамическими, т. е. вы можете добавлять или удалять элементы из массива по мере необходимости.
Создание массива
Буквенный синтаксис
Вот массив, в котором хранятся 3 элемента разных типов:
const myArray = ['a', 42, 3.14];
Array
Конструктор
const myArray = new Array('a', 42, 3.14);
Самоанализ
Arrays
реализованы в JavaScript как объекты:
console.log(typeof myArray); // prints: object
Вы можете проверить, является ли переменная массивом:
const myArray = ['a', 42, 3.14]; console.log(Array.isArray(myArray)); //prints true
Индексы элементов
Массивы индексируются 0, поэтому для доступа к третьему элементу массива мы будем использовать:
myArray[2]; // returns: 42
Индексы также используются, если нужно извлечь диапазон элементов из массива — в приведенном ниже примере мы извлекаем элементы из индекса 2 в индекс 4. Обратите внимание, что индекс 4 не включен в ответ:
myArray.slice(2, 4); // returns: Array [ 42, 3.14 ]
Итерация
Существует несколько способов перебора элементов массива.
Использование forEach:
myArray.forEach(function(item) { console.log(item); });
Классический цикл for:
for(let i = 0; i < myArray.length; i++) { console.log(myArray[i]); }
цикл `for…in`:
for(const item of myArray) { console.log(item); };
Изменение массивов
толкать и поп
Для добавления и удаления элементов из конца массива доступны 2 метода: push
и pop
.
push
позволяет нам добавить один или несколько элементов в конец массива — в приведенном ниже примере мы добавляем строку и объект:
myArray.push('Hello', {'x': 1}); // returns: 5 // the new number of elements in our array console.log(myArray); // prints Array(5) [ "a", 42, 3.14, "Hello", {...} ]
pop
удаляет и возвращает последний элемент:
myArray.pop(); // returns: Object { x: 1 } console.log(myArray); // prints: Array(4) [ "a", 42, 3.14, "Hello" ]
сдвигать и не сдвигать
Чтобы добавлять и удалять элементы из начала массива, мы будем использовать unshift
и shift
.
Так же, как `push`, `unshift` принимает один или несколько параметров:
myArray.unshift('Start', {'y': 2}); // returns: 6 console.log(myArray); // prints: Array(6) [ "Start", {...}, "a", 42, 3.14, "Hello" ]
Аналогичным образом `shift` удаляет и возвращает первый элемент:
myArray.shift(); // returns "Start" console.log(myArray); // prints: Array(5) [ {...}, "a", 42, 3.14, "Hello" ]
Фильтр
Как следует из названия, мы «фильтруем» элементы массива на основе заданных критериев; в приведенном ниже примере мы находим все четные числа в массиве:
let myArray = [1, 4, 42, 11, 79]; let letters = myArray.filter((item) => { return (item % 2) === 0; }); console.log(letters); // prints: [4, 42]
Давайте рассмотрим немного более сложный пример извлечения всех строковых элементов из массива:
let myArray = ["a", 42, 3.14]; let letters = myArray.filter((item) => { return Object.prototype.toString.call(item) === "[object String]"; }); console.log(letters); // prints: ["a"]
карта
Метод map
позволяет нам преобразовать каждый элемент массива в другой объект на основе определенного потока. Здесь мы вызываем функцию стрелки для каждого элемента массива:
let myArray = [1, 4, 42, 11, 79]; let doubleArray = myArray.map((item) => { return item * 2; }); console.log(doubleArray); // prints: [2, 8, 84, 22, 158]
Обратите внимание, что мы возвращаем новый массив, в то время как исходный остается неизменным.
Одним из очень распространенных вариантов использования является возврат массива, содержащего свойство объекта:
let articles = [ { title: 'article 1', abstract: 'abstract 1'}, { title: 'article 2', abstract: 'abstract 2'}, { title: 'article 3', abstract: 'abstract 3'} ]; let titles = articles.map((article) => { return article.title; }); console.log(titles); // prints: ["article 1", "article 2", "article 3"]
Уменьшать
Метод reduce
поначалу может показаться немного запутанным, но подсказка кроется в названии — он сводит весь массив к одному значению. Давайте посмотрим, как вычислить сумму всех элементов массива:
let myArray = [1, 4, 42, 11, 79]; let total = myArray.reduce((item, currentTotal) => { return currentTotal + item; }, 0); console.log(total); // prints: 137
Обратите внимание, что reduce
принимает 2 параметра: стрелочную функцию, которая вычисляет текущий шаг, и начальное значение. Значение, возвращаемое на одном шаге, вводится как currentTotal
для следующего шага или возвращается, когда мы исчерпали массив.
Выше мы упоминали, что reduce
"уменьшает" массив до одного значения - это верно, когда массив одномерный. Но его также можно использовать для выравнивания многомерных массивов:
let myArray = [[1, 4], 23, [42, 11], 79]; const flatArray = myArray.reduce((currentFlatArray, amount) => { return currentFlatArray.concat(amount); }, []); console.log(flatArray); // prints: [1, 4, 23, 42, 11, 79]
Практический пример
Подсчитаем частоту слов в тексте:
let text = 'Alice was beginning to get very tired of sitting ' + 'by her sister on the bank, and of having nothing to do : ' + 'once or twice she had peeped into the book her sister was ' + 'reading, but it had no pictures or conversations in it ... '; // 1. Split text into words let words = text.split(" "); // 2. Compute word count var wordsCount = words.reduce( (tally, word) => { let lowercaseWord = word.toLowerCase(); tally[lowercaseWord] = (tally[lowercaseWord] || 0) + 1 ; return tally; } , {}); // 3. Sort word count with the most used first // 3.1. Create array from dictionary var wordsCountArray = Object.keys(wordsCount).map(function(key) { return [key, wordsCount[key]]; }); // 3.2. Sort the array based on the second element wordsCountArray.sort(function(first, second) { return second[1] - first[1]; }); // 4. Display the end result console.log(wordsCountArray);
Вывод покажет наиболее часто используемые слова:
[["was", 2], ["to", 2], ["of", 2], ["her", 2], ["sister", 2], ["the", 2], ["or", 2], ["had", 2], ["it", 2], ["alice", 1], ["beginning", 1], ["get", 1], ["very", 1], ["tired", 1], ["sitting", 1], ["by", 1], ["on", 1], ["bank,", 1], ["and", 1], ["having", 1], ["nothing", 1], ["do", 1], [":", 1], ["once", 1], ["twice", 1], ["she", 1], ["peeped", 1], ["into", 1], ["book", 1], ["reading,", 1], ["but", 1], ["no", 1], ["pictures", 1], ["conversations", 1], ["in", 1], ["...", 1], ["", 1]]
Первоначально опубликовано на https://www.90-10.dev 10 января 2023 г.