Работа с массивами в JavaScript
Удаление элементов
const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
shift()
- удаляет из массива первый элемент и возвращает его
const first = numbers.shift(); // 0
console.log(numbers); // [1, 2, 3 ...]
pop()
- удаляет из массива последний элемент и возвращает его
const last = numbers.pop(); // 9
console.log(numbers); // [1, 2, 3, 4, 5, 6, 7, 8]
splice(start, length)
- удаляет и возвращает length
элементов из массива, начиная с индекса start
const middle = numbers.splice(4, 3); // [4, 5, 6]
console.log(numbers); // [0, 1, 2, 3, 7, 8, 9]
numbers.splice(3); // удалит все элементы начиная с индекса 3
Поиск элементов
const students = [
{name: "Василий", age: 18},
{name: "Геннадий", age: 23},
{name: "Андрей", age: 17},
{name: "Тимофей", age: 29},
{name: "Иннокентий", age: 17},
];
find()
- вернет первый попавшийся элемент по заданному условию
findIndex()
- вернет индекс первого попавшегося элемента по заданному условию
students.find(student => student.name === "Андрей" && student.age === 17);
// -> { name: "Андрей", age: 17 }
students.findIndex(student => student.name === "Андрей" && student.age === 17);
// -> 2
every()
- вернет true, если все элементы соответствуют заданному условию. False, если не соответствуют
students.every(student => student.age < 30); // true, все студенты младше 30 лет
students.every(student => student.age >= 18); // false, есть несовершеннолетние
some()
- вернет true, если хотя бы один элемент соответствует заданному условию. False, если нет таких
элементов;
students.some(student => student.age < 18); // true, есть несовершеннолетние
students.every(student => student.name === "Иван"); // false, ни одного Ивана
Отфильтровать массив
// Только несовершеннолетние студенты
const kids = students.filter(student => student.age < 18)
/*
[
{ name: "Андрей", age: 17 },
{ name: "Иннокентий", age: 17 },
]
*/
// Все, кроме Андреев
const notAndrey = students.filter(student => student.name !== "Андрей")
/*
[
{ name: "Василий", age: 18 },
{ name: "Геннадий", age: 23 },
{ name: "Тимофей", age: 29 },
{ name: "Иннокентий", age: 17 },
]
*/
Преобразование/перебор элементов
map()
- преобразует элементы массива в другие элементы (возвращает новый массив)
students.map(student => student.name); // [Василий, Геннадий, Андрей, Тимофей, Иннокентий]
forEach()
- альтернатива циклу. Выполняет произвольный код на каждой итерации
students.forEach((student, index) => {
console.log(`Студент №${index + 1}: №{student.name}`);
});
Пересчет элементов
reduce(fn(a, b), c)
1-й аргумент — функция. В нее первым аргументом передается уже накопленное значение, а вторым — очередной элемент массива.
2-й аргумент — начальное значение
// Товары в корзине
const cartItems = [
{name: "Гречка", price: 50, quantity: 3},
{name: "Сок", price: 100, quantity: 1},
{name: "Перфоратор", price: 8000, quantity: 2},
]
// Посчитаем сумму к оплате
cartItems.reduce(
(total, item) => total + item.price * item.quantity,
0 // начальное значение для total
)
// Вычисление без метода reduce
let total = 0;
for (const item of cartItems) {
total = total + item.price * item.quantity;
}
Другие методы
reverse()
- вернет новый перевернутый массив
const numbersReversed = numbers.reverse();
// -> [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
sort()
- отсортирует по возрастанию значений (строковые значения)
numbersReversed.sort(); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbersReversed.push(10, 11);
numbersReversed.sort(); // [0, 1, 10, 11, 2, 3, 4, 5, 6, 7, 8, 9]
// для правильной сортировки чисел по возрастанию
numbersReversed.sort((a, b) => a - b); // [0, 1, 2 ... 11]
// по убыванию
numbersReversed.sort((a, b) => b - a); // [11, 10, 9 ... 0]
slice()
- полностью или частично копирует массив
numbers.slice(); // полная копия
numbers.slice(3); // копия от элемента с индексом 3 и до конца [3, 4 ... 9]
numbers.slice(-5); // копия 5-ти последних элементов [5, 6, 7, 8, 9]
numbers.slice(3, 5); // копия от индекса 3 до индекса 5, последний не включается [3, 4]
numbers.slice(2, -2); // копия от индекса 2 до предпоследнего элемента (2-7)
numbers.slice(100, 100); // пустой массив, в исходном нет таких индексов
Аналогичные строкам методы
includes()
- проверяет наличие элемента в массиве
numbers.includes(100); // false
numbers.includes(8); // true
indexOf()
- находит индекс элемента в массиве
numbers.indexOf(100); // -1
numbers.indexOf(0); // 0, индекс первого значения 0 в массиве