ForEach vs Map vs Reduce что и когда?

1,00
р.
Столкнулась с тем что не понимаю когда применять метод map а когда forEach, так же постоянно встречаю reduce, но неясно почему выбирают его а не напрмер тот же map.
Кода следует использовать map, когда reduce, а когда forEach?
В чем их основное отличие?

Ответ
Методы map, forEach, и reduce действительно имеют много общего, что и когда использовать зависит от того, какой именно результат по итогу требуется получить.
Представим что у нас есть массив:
const locations = [ {country: "Россия", population: 10}, {country: "Китай", population: 100}, {country: "США", population: 20} ]
Если нам нужно просто выполнить определенное действие для каждого элемента массива, то тут подойдет метод forEach:
locations.forEach(location => { console.log(location) // мы получим три вывода в консоль // по одному для каждой локации // {country: "Россия", population: 10} // {country: "Китай", population: 100} // {country: "США", population: 20} })
// или так, если нам нужно только определенное значение
locations.forEach(location => { console.log(location.country) // Россия // Китай // США })
// или так, по количеству значений в массиве
locations.forEach(() => { console.log("Как дела?") // Как дела? // Как дела? // Как дела? })
Если мы хотим трансформировать наш массив и занести результаты в переменную, то тут метод map будет более уместен чем forEach, поскольку первый по итогу сразу вернет новый массив.
Посмотрим на разницу forEach vs map в случае когда нам нужно "обернуть" каждое название страны в HTML таг:
// через forEach const result = [] locations.forEach(location => { result.push(`

${location.country}

`) }) console.log(result) // ["

Россия

", "

Китай

", "

США

"]
// с использованием map const result = locations.map(location => `

${location.country}

`) console.log(result) // ["

Россия

", "

Китай

", "

США

"]
Метод reduce отличается от map тем что он возвращает финальное "значение".
Допустим мы хотим посчитать суммарный размер населения:
const result = locations.reduce((total, location) => { return total + location.population }, 0)
console.log(result) // 130
Это достаточно простой пример, но "финальным значением" может быть не только число, а, например, объект или массив, что делает метод reduce поистине мощным инструментом трансформаций.