# 11 Структуры данных JS: массивы

Эта статья принадлежит к серии Структуры данных JS, которая будет содержать следующие статьи:

  • Массивы
  • Стеки
  • Очереди
  • Связанный список (скоро)
  • Устанавливает (скоро)
  • Словари / карты (скоро)
  • Таблицы хешей (скоро)
  • Деревья: двоичное дерево поиска (BST) (скоро)
  • Деревья: AVL Tree (скоро)
  • Деревья: Красно-черное дерево (скоро)
  • Деревья: двоичная куча / Heapsort (скоро)
  • Графики (скоро)

Как и любой другой язык программирования, JS поддерживает массивы, массивы являются самой простой структурой данных и помогают нам хранить данные последовательно, предположим, что мы хотим хранить животных в зоопарке, без массива, который мы могли бы сделать следующим образом:

const animal1 = 'elephant';
const animal2 = 'monkey';
const animal3 = 'snake';
const animal4 = 'lion';

Проблема в том, что нам нужно создать переменную для каждого животного, если в зоопарке 1000 животных, нам нужно 1000 переменных, управлять этим сложно и в зависимости от ситуации невозможно, представьте, что вы создаете список из тысяч человек, живущих в вашем городе, с использованием переменных.

Для решения подобных ситуаций мы могли бы использовать массив, аналогичный пример выше может быть выполнен следующим образом:

const animals = ['elephant', 'monkey', 'snake', 'lion'];

Все просто, правда? Массивы дают нам дополнительные возможности для обработки более сложных наборов данных!

Создание массива

Есть много способов создать массив, мы могли бы сделать это с помощью оператора new:

const myArray = new Array();

Также можно определить количество предметов таким образом:

const myArray = new Array(9);

Это особенно полезно, когда вам нужно выполнить операцию фиксированное количество раз, скажем, мы хотим 10 раз напечатать «привет», мы могли бы это сделать:

[...Array(10)].forEach(emptyItem => console.log('Hello'));

Но наиболее распространенный способ создания массива - просто использовать [] вместо слов New и Array, например:

const myArray = [];

Многомерные массивы

Массивы позволяют нам создавать массивы внутри массивов, которые генерируют массивы 3D, 4D или xD, скажем, мы храним результаты чемпионата по футболу, мы могли бы сделать это следующим образом:

const soccerChampionshipResults = [[3, 2], [0, 0], [1, 0], [4, 1]]

В этом примере мы создаем трехмерный массив и можем получить доступ к каждому результату так же, как и до того, как soccerCha ChampionshipResults [0] вернет [3, 2], soccerCha ChampionshipResults [1] вернет значение [0, 0] и так далее.

Доступ к элементам массива

Вы можете получить доступ к элементу внутри массива, указав курсор непосредственно на желаемый элемент следующим образом:

const animals = ['elephant', 'monkey', 'snake', 'lion'];
console.log(animals[2])

В этом примере вы получите третий элемент (змейку) вашего массива, причина в том, что указатель массива начинается с 0.

const animals = [
  'elephant', // element number 0
  'monkey', // element number 1
  'snake',  // element number 2
  'lion' // element number 3
];

Если вам нужно узнать, сколько элементов в массиве, вы можете использовать атрибут длины:

const animals = ['elephant', 'monkey', 'snake', 'lion'];
console.log(animals.length) // will return 4

Другой метод доступа к элементам внутри массива - использование метода forEach:

const animals = ['elephant', 'monkey', 'snake', 'lion'];
animals.forEach(animal => console.log(`Hello I am a ${animal}`));
/* will output
Hello I am a elephant
Hello I am a monkey
Hello I am a snake
Hello I am a lion
*/

Вы также можете использовать map, reduce, filter, for..in, for..of в зависимости от того, что вы хотите сделать, если вы хотите больше об этих методах, я написал несколько статей об этом:





Создание новых элементов в массиве

Есть много разных способов добавить элемент, в зависимости от того, в какую позицию вы хотите добавить этот элемент, например:

Добавление элемента в начало массива

Чтобы добавить элемент в начало массива, вам нужно переместить другие элементы в новую позицию, вы можете сделать это следующим образом:

Но самый простой способ сделать это - использовать функцию unshift:

const animals = ["elephant", "monkey", "snake", "lion"];
animals.unshift('macaw');
console.log(animals); // will return [ 'macaw', 'elephant', 'monkey', 'snake', 'lion' ]

Добавление элемента в конец массива

Это проще, чем добавлять в середине или в начале, вы можете использовать для этого array.length:

const animals = ["elephant", "monkey", "snake", "lion"];
animals[animals.length] = 'macaw';
console.log(animals); // will return [ 'elephant', 'monkey', 'snake', 'lion', 'macaw' ]

Атрибут array.length всегда возвращает количество элементов внутри массива, вы также можете использовать метод push для добавления элементов в конце, например:

const animals = ["elephant", "monkey", "snake", "lion"];
animals.push('macaw');
console.log(animals); // will return [ 'elephant', 'monkey', 'snake', 'lion', 'macaw' ]

Добавление элементов в середину (или в любую позицию) массива

Процесс добавления посередине почти такой же, как и добавление начала, разница в том, что вы перемещаете элементы только после желаемой позиции:

Вы также можете использовать собственный метод splice, чтобы сделать то же самое самым простым способом:

const animals = ["elephant", "monkey", "snake", "lion"];
animals.splice(2, 0, 'macaw');
console.log(animals); // will return [ 'elephant', 'monkey', 'snake', 'lion', 'macaw' ]

Где 2 - это позиция, которую вы хотите добавить, а 0 - это общее количество элементов, которые вы хотите удалить после этой позиции.

Удаление элементов из массива

Способы удаления элемента различаются в зависимости от положения, в котором вы хотите удалить элемент.

Удаление элемента с самого начала

Чтобы удалить с начала, вам нужно перезаписать первый элемент вторым, второй - третьим и так далее, после этого нам нужно переопределить длину массива, чтобы игнорировать последний элемент:

Лучше использовать подход переопределения длины, чем использовать удаление, как только удаление сохранит последний элемент без какого-либо значения, например:

const animals = ["elephant", "monkey", "snake", "lion"];
delete animals[3];
console.log(animals); // will return [ 'elephant', 'monkey', 'snake', <1 empty item> ]
console.log(animals.length); // will return 4

Вы также можете использовать собственный метод shift, чтобы удалить элемент самым простым способом:

const animals = ["elephant", "monkey", "snake", "lion"];
animals.shift();
console.log(animals); // will return [ 'monkey', 'snake', 'lion' ]

Удаление элемента из середины (или любой позиции) из массива

Чтобы удалить из середины, вам нужно переместить все элементы назад после позиции элемента, который вы хотите удалить, например:

Вы также можете использовать метод splice без третьего параметра, чтобы удалить элемент, который вы хотите:

const animals = ["elephant", "monkey", "snake", "lion"];
animals.splice(2, 1); 
console.log(animals); // will return ["elephant", "monkey", "lion"]

Где 2 - это позиция элемента, а 1 - количество элементов, которые вы хотите удалить.

Удаление элемента из конца массива

Удалить элемент с конца очень просто, вам нужно просто переопределить длину до длины -1:

const animals = ["elephant", "monkey", "snake", "lion"];
animals.length = animals.length - 1;
console.log(animals); // will return ["elephant", "monkey", "snake"]

Вы также можете удалить более одного элемента из конца, определяющего длину до length -x, где x - количество элементов, которые вы хотите удалить.

animals.length = animals.length - 2;
console.log(animals); // will return ["elephant", "monkey"]

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

Сортировка по умолчанию

Самый простой метод сортировки для организации элементов в порядке Unicode - это использование метода сортировки:

const animals = ["elephant", "monkey", "snake", "lion"];
animals.sort();
console.log(animals); // will return [ 'elephant', 'lion', 'monkey', 'snake' ]

Этот метод выполняет сортировку на месте, что означает, что он не создаст новый массив, а заменит текущий порядок массива.

Будьте осторожны, когда у вас есть элементы с нижним и верхним регистром внутри вашего массива, когда символы верхнего регистра идут первыми в таблице Unicode, поэтому такой элемент, как Zebra, будет помещен перед элементом, например, под названием аллигатор.

const animals = ["elephant", "monkey", "Zebra", "snake", "lion"];
animals.sort();
console.log(animals); // will return [ 'Zebra', 'elephant', 'lion', 'monkey', 'snake' ]

Пользовательская сортировка

Метод сортировки позволяет вам создавать свои собственные алгоритмы сортировки, скажем, у вас есть массив со списком населения, и вы хотите упорядочить его от наименьшего к наибольшему населению, вы можете сделать это:

const populationList = [10000000, 1000000, 500000, 600000];
populationList.sort((a, b) => a - b);
console.log(populationList); 
// will return: [ 500000, 600000, 1000000, 10000000 ]

Обратная сортировка

Возможно инвертировать элементы массива, используя алгоритм ниже:

Идея состоит в том, чтобы пройти по массиву до середины, заменяя каждый элемент элементом на другой стороне массива, например, заменяя первый на последний, а последний на первый, второй на предпоследний и скоро.

Кроме того, вы можете использовать собственный метод reverse (), чтобы сделать то же самое:

const animals = ["elephant", "monkey", "snake", "lion", "zebra"];
animals.reverse();
console.log(animals); 
// will return [ 'zebra', 'lion', 'snake', 'monkey', 'elephant' ]

Единственное отличие заключается в том, что обратный метод выполняется внутри текущего массива, а первый подход создает новый обратный массив.

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

Метод indexOf

Есть много способов поиска в массиве в Javascript, начнем с indexOf:

const animals = ["elephant", "monkey", "snake", "lion"];
const haveMonkeyInList = animals.indexOf("monkey") > -1;
const positionWhereMonkeyWasFound = animals.indexOf("monkey");
console.log({ haveMonkeyInList, positionWhereMonkeyWasFound });
// will output: { haveMonkeyInList: true, positionWhereMonkeyWasFound: 1 }

Когда indexOf находит искомый элемент, он возвращает позицию, где этот элемент был найден, когда indexOf не нашел искомого элемента, он возвращает -1.

Фильтр метода

Основная идея метода фильтрации - создать новый массив, следуя некоторому заданному условию, но его также можно использовать для возврата нового массива с найденными элементами:

const animals = ["elephant", "monkey", "snake", "lion"];
const animalsWithLetterE = 
  animals.filter(
   animal =>
    animal.indexOf("e") > -1
  );
console.log(animalsWithLetterE);
// will output: [ 'elephant', 'monkey', 'snake' ]

В приведенном выше примере мы смешали indexOf с методом фильтрации, но в этом случае мы используем indexOf для поиска подстроки внутри строки.

Метод включает

Спецификация ES7 предоставила нам метод include, который уменьшает это:

const haveMonkeyInList = animals.indexOf('monkey') > -1

К этому:

const haveMonkeyInList = animals.includes('monkey')

Также можно отправить дополнительный параметр, определяющий, с какой позиции вы хотите начать поиск:

const animals = ["elephant", "snake", "monkey", "lion"];
console.log(animals.includes('monkey', 1));
// will return true because exists an element called 'monkey' from  the item with index 1
console.log(animals.includes('elephant', 1));
// will return false because doesn't exists an element called 'elephant' from the item with index 1

Другие методы массивов

нанизывать()

Позволяет выводить содержимое массива в строковом формате:

const animals = ["elephant", "snake", "monkey", "lion"];
console.log(animals.toString());
// will output: "elephant,snake,monkey,lion"

присоединиться()

Подобно toString, метод позволяет нам выводить содержимое массива в строковом формате, но можно определить другой разделитель, кроме запятой:

const animals = ["elephant", "snake", "monkey", "lion"];
console.log(animals.join('-'));
// will output: "elephant-snake-monkey-lion"

fill ()

Позволяет заменить содержимое строк в массиве новым содержимым

const animals = ["elephant", "snake", "monkey", "lion"];
console.log(animals.fill('animals'));
// will output: ["animals", "animals", "animals", "animals"]

Также можно определить начальный индекс и конечный индекс элементов, которые будут заполнены.

const animals = ["elephant", "snake", "monkey", "lion"];
console.log(animals.fill('animals', 2, 3));
// will output: ["elephant", "snake", "animals", "lion"]

из()

Позволяет создать новый массив из старого:

const animals = ["elephant", "snake", "monkey", "lion"];
const animalsCopy = Array.from(animals);
animals[0] = 'zebra';
console.log(animalsCopy);
// will output: ["elephant", "snake", "monkey", "lion"]

Если вы хотите узнать больше о Javascript и структурах данных, я рекомендую эти книги:

  • Вы не знаете серию JS от Кайла Симпсона (мой любимый)
  • Eloquent JS от Марин Хавербеке
  • Head First Javascript, Майкл Моррисон
  • Секреты JavaScript-ниндзя Беар Бибо и Джон Ресиг
  • Изучение структур данных и алгоритмов JavaScript, автор - Лойан Гронер

Если вы говорите по-португальски, посмотрите мои видео на YouTube о структурах данных в Javascript:

Спасибо за внимание! Не стесняйтесь нажимать кнопку рекомендовать ниже, если вы нашли эту статью полезной, также напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.



Если этот пост был полезен, нажмите кнопку хлопать 👏 ниже, чтобы выразить свою поддержку! ⬇⬇