Основное различие между 'map` и' reduce`

я использовал оба метода, но я довольно смущен относительно использования обоих методов.

- Это все map могу сделать, но reduce не может и наоборот?

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

4 ответов


источник

и map и reduce есть в качестве входных данных массив и функции. Они в некотором роде дополняют друг друга:map не удается вернуть один элемент для массива из нескольких элементов, в то время как reduce всегда будет возвращать аккумулятор, который вы в конечном итоге изменили.

map

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

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

// A function which calculates the square
const square = x => x * x

// Use `map` to get the square of each number
console.log([1, 2, 3, 4, 5].map(square))

reduce

используя массив в качестве входных данных, вы можете получить один элемент (скажем, объект, или число, или другой массив) на основе функции обратного вызова (первый аргумент), который получает accumulator и current_element параметры:

const numbers = [1, 2, 3, 4, 5]

// Calculate the sum
console.log(numbers.reduce(function (acc, current) {
  return acc + current
}, 0)) // < Start with 0

// Calculate the product
console.log(numbers.reduce(function (acc, current) {
  return acc * current
}, 1)) // < Start with 1

какой из них следует выбрать, когда вы можете сделать то же самое с обоими? Попробуйте представить, как выглядит код. В приведенном примере вы можете вычислить массив квадратов, как вы упомянули, используя reduce:

// Using reduce
[1, 2, 3, 4, 5].reduce(function (acc, current) {
    acc.push(current*current);
    return acc;
 }, [])

 // Using map
 [1, 2, 3, 4, 5].map(x => x * x)

теперь, глядя на них, очевидно, что вторая реализация выглядит лучше, и она короче. Обычно вы выбираете более чистое решение, которое в этом случае является map. Конечно, вы можете сделать это с reduce, но в двух словах, подумайте, что было бы короче, и в конечном итоге это было бы лучше.


обычно "карта" означает преобразование ряда входных данных в равной длины серия выходов в то время как "уменьшить" означает преобразование серии входов в меньше количество выходов.

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

когда вы "сопоставляете", вы пишете функцию, которая преобразует x с f(x) в какое-то новое значение x1. Когда вы " уменьшаете" вы пишете какую-то функцию g(y) это занимает array y и излучает массив y1. Они работают с различными типами данных и дают разные результаты.


на map() функция возвращает новый массив, передавая функцию над каждым элементом входного массива.

это разные reduce() который принимает массив и функцию таким же образом, но функция принимает 2 входы-аккумулятор и текущее значение.

так reduce() может использоваться как map() Если вы всегда .concat на аккумулятор следующий выход из функции. Однако он чаще используется для уменьшения размеров массива таким образом, либо принимая одномерное и возвращая одно значение, либо сглаживая двумерный массив и т. д.


давайте посмотрим два из этого по одному

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

var arr = [1, 2, 3];

var mapped = arr.map(function(elem) {
    return elem * 10;
})

console.log(mapped); // it genrate new array

уменьшить Метод Reduce объекта array используется для уменьшить массив до одного значение.

var arr = [1, 2, 3];

var sum = arr.reduce(function(sum, elem){
    return sum + elem;
})

console.log(sum) // reduce the array to one single value