Будучи впечатлительным «буткемпером», который впервые погрузился в JavaScript почти на 2,5 месяца, легко сразу же увлечься блестящими объектами. Изучение сотен концепций за такой короткий период может быть подавляющим, но я думаю, что важно остановиться и восхититься тем, что вы уже оценили в этих концепциях. Я думаю, что метод reduce — это мой блестящий объект, пока что.
Для меня итерации данных были совершенно чуждыми. Этого не было в моем поле зрения. Идея перебора массива букв, цифр, слов и «всякой всячины» была для меня неподготовленной. О, и заставить его вернуть что-то после? Что? Я был невежественным, проще говоря. После изучения императивного стиля for-looping, снова и снова, мне стало ясно, как простой код типа:
let array = [2, 4, 6, 8];
const sum = (array) => {
let result = 0;
for (let i = 0; i < array.length; i++) {
result += array[i];
}
return result;
};
console.log(sum(array)); -> 20
… может быстро выйти из-под контроля, особенно когда мы вводим в уравнение сложный код, математику или условия.
…
В дело вступает метод Reduce. Кажется, что метод Reduce не имеет границ. Он может делать то же, что Map, Filter и многие другие функции массивов JavaScript, и при этом выглядит лучше. Возьмем мой пример с циклом for, приведенный выше, и отфотошопим его с помощью Reduce:
let array = [2, 4, 6, 8];
const sum = (array) => array.reduce((total, item) => total += item, 0);
console.log(sum(array)); -> 20
Ух ты. Так намного чище. Это чисто. Одна строка кода, которая делает то, что вы хотите, а не указывает ей, что делать. Как новичок, я чувствую себя более уверенно, и, возможно, немного меньше способен испортить эту функцию, хотя я бы не стал этого делать.
…
Далее я использую пример кодирования, который был представлен мне в bootcamp. Хотя я понимаю, что эта игрушечная задача заставляет меня программировать в стиле «мыслить нестандартно», я не могу не испытывать раздражения, зная, что аналогичного результата можно достичь, используя только метод Reduce. Например, вернуть массив всех людей, чьи любимые вещи включают «stuff1», используя Reduce AND forEach:
const people = [
{
person: 'person1',
favStuff: ['stuff1', 'stuff2', 'stuff3'],
},
{
person: 'person2',
favStuff: ['stuff4', 'stuff1', 'stuff5'],
},
{
person: 'person3',
favStuff: ['stuff6', 'stuff7', 'stuff8'],
},
{
person: 'person4',
favStuff: ['stuff9', 'stuff1', 'stuff10'],
}
];
const stuff = (people) => {
var newArr = people.reduce(function(arr, curr) {
curr.favStuff.forEach(function(stuff) {
if (stuff === 'stuff1') {
arr.push(curr.person);
}
});
return arr;
}, []);
return newArr;
};
console.log(stuff(people)); -> ['person1', 'person2', 'person4']
Я не пытаюсь нахваливать себя, у меня ушло на это 25-30 минут, в основном потому, что у меня было туннельное зрение. Я все время хотел решить эту задачу, используя только Reduce, и ничего больше. Мне пришлось убедить свой мозг решить проблему таким образом… и пригласить forEach на свою вечеринку, хотя ему там не рады.
Продолжая свой путь в кодировании, я надеюсь подобрать больше инструментов по пути и, надеюсь, сблизиться с ними. Мне нужно искать положительные моменты и меньше концентрироваться на многочисленных трудностях, с которыми сталкивает меня лабиринт кодинга. Также, пока я не забыл, и мой мозг не взорвался от сдерживания (и синдрома самозванца), вот функция «stuff», использующая только Reduce:
const stuff = (people) => {
let result = people.reduce(function(arr, curr) {
if (curr.favStuff.includes('stuff1')) {
arr.push(curr.person);
}
return acc;
}, []);
return result;
}
console.log(stuff(people)); -> ['person1', 'person2', 'person4']