В этом уроке разберем популярные методы для работы с JS массивами. Как они работают, для чего используются, какой когда применять и как делать это правильно. Данные методы пригодятся вам для обработки данных при разработке React JS приложений и не только. Поехали!)
Видео
Файлы к уроку
Для урока я буду использовать массив с товарами, на примере которого будут применены данные методы. Ниже привожу его код и структуру.
const products = [
	{
		id: 1,
		img: 'macbook.jpg',
		title: 'MacBook',
		price: 100,
	},
	{
		id: 2,
		img: 'apple-watch.jpg',
		title: 'Apple watch',
		price: 40,
	},
	{
		id: 3,
		img: 'mac-pro.jpg',
		title: 'Mac Pro',
		price: 190,
	},
	{
		id: 4,
		img: 'ipad.jpg',
		title: 'iPad',
		price: 60,
	},
	{
		id: 5,
		img: 'iphone.jpg',
		title: 'iPhone',
		price: 40,
	},
];Метод forEach
Метод forEach делает обход по массиву. Используется чтобы пройтись по всем элементам массива и сделать с ними нужные действия.
Синтаксис метода:
arr.forEach(function(item, index, array) {
  // ... код для действий с item
});Например мы можем пройтись по массиву с товарами и вывести каждый товар в консоль:
products.forEach(function(item) {
	console.log(products);
});А можем увеличить стоимость каждого товара в массиве на 100 и вывести в консоль название и уже обновленную стоимость товара:
products.forEach(function(product) {
	item.price += 100;
	console.log(product.title);
  	console.log(product.price);
});Как видно из примера выше, имя параметра можно изменять на свое исходя из контекста. Если обходим массив с товарами то вместо item, первый параметр можно назвать products, если это будет список пользователей users, то первый параметр можно назвать user.
Метод find
Находит и возвращает первый подходящий элемент массива. В процессе работает с текущим массивом.
Синтаксис:
let result = arr.find(function(item, index, array) {
  // если ф-я возвращает true - возвращается текущий элемент и перебор прерывается
  // если все итерации оказались ложными, возвращается undefined
});Решим практическую задачу. Найдем в массиве с товарами товар который имеет название «Mac Pro»
const macPro = products.find((item) => {
    if (item.title === "Mac Pro") {
        return true;
    }
})
console.log(macPro); // Будет выведен объект с товаром
console.log(`Товар с названием 'Mac Pro' стоит ${macPro.price} руб. `); Метод findIndex
Находит и возвращает индекс первый подходящего элемент массива. Синтаксис такой же как и у метода find.
Используем метод findIndex чтобы найти индекс товара с ценой равной 40. В нашем массиве таких товаров два. Будет найден первый подходящий, в нашем случае это будет товар ‘Apple watch’.
const cost40 = products.findIndex((item) => {
	if (item.price === 40) {
		return true;
	}
});
console.log(cost40); // 'Apple watch'
console.log(`Индекс товара с ценой 40`, cost40);Метод filter
Фильтрует текущий массив, через функцию callback. Возвращает новый отфильтрованный массив.
Синтаксис:
let results = arr.filter(function(item, index, array) {
  // если true - элемент добавляется к результату, и перебор продолжается
  // возвращается пустой массив в случае, если ничего не найдено
});Найдем все товары с ценой больше 50:
const moreThen50 = products.filter(function (item) {
	if (item.price > 50 ) {
		return true;
	}
});
console.log(moreThen50); // массив из трех товаров 'MacBook', 'Mac Pro', 'iPad'Метод map
Метод map является одним из наиболее полезных и часто используемых. Он вызывает функцию для каждого элемента массива и возвращает массив результатов выполнения этой функции.
Синтаксис:
let result = arr.map(function(item, index, array) {
  const newItem = {...item}
  return newItem;
  // возвращается новое значение вместо текущего элемента
});Практический пример. Создадим новый массив с товарами, но у каждого товара цена будет больше на 50% от текущей.
const productsNewPrice = products.map(function (item) {
	const newItem = {
		id: item.id,
		img: item.img,
		title: item.title,
		price: item.price * 1.5,
	};
	return newItem;
});
console.log('Новый массив, товары с ценами +50%');
console.log(productsNewPrice);Еще пример. Допустим мы хотим вывести все товары на страницу, используя определенную html разметку. Такой подход часто встречается в React JS когда необходимо вывести данные на страницу.
const productsHTML = products.map((item, index) => {
    let htmlProduct =
            `<section>
                <h3>${item.title}</h3>
                <p><strong>${item.price}</strong></p>
                <img width="200" src="./img/products/${item.img}" alt="${item.title}" />
            </section>`;
    if (index !== products.length - 1) htmlProduct += '<hr>'
    return htmlProduct
});
document.body.insertAdjacentHTML('beforeend', productsHTML.join(''))
Обходим все товары, для каждого возвращаем кусок HTML разметки с подстановкой данных. По итогу имеем массив с разметкой. Для вывода на страницу используем insertAdjacentHTML. Чтобы избавиться от запятых , в виде разделителей элементов массива, используем join('').
Метод reduce
Метод reduce используется для вычисления единого значения на основе всего массива. Например чтобы посчитать общую сумму на основе всех элементов массива.
Синтаксис:
let value = arr.reduce(function(previousValue, item, index, array) {
  // код который будет выполнять действия и возвращать текущий результат для каждой итерации
}, [initial]);initial указано в квадратных скобках, так как это необязательный параметр.
Пример. Посчитаем общую стоимость всех товаров в массиве products.
const totalCost = products.reduce((prev, item) => {
    return prev + item.price
}, 0)
console.log(`Общая стоимость товаров: ${totalCost}`); // 430Первым аргументом передаем callback функцию которая будет производить вычисления, вторым аргументом стартовое значение. Так как считаем сумму с ноля, то стартовым значением передаем 0.
В функции callback определяем аргументы. 
prev — значение из предыдущей итерации. При первой итерации это будет initial значение, в нашем случае переданный нами 0.
item — значение текущего элемента массива, в текущей итерации.
Внутри функции callback выполняем вычисления, складывая предыдущее значение вычисления со стоимостью товара в текущей итерации.
Листинг вычислений можно описать следующим образом:
return 0 + 100 // 100 return 100 + 40 // 140 return 140 + 190 // 330 return 330 + 60 // 390 return 390 + 40 // 430 // Результат 430
Это был первый материал по методам массивов JS. Надеюсь он был интересен и полезен. Увидимся в следующих уроках!)
                                    





