Использование сокращения в Javascript
Привет, ребята, это ваш мальчик Майк идет к вам с полезным итератором, который нужно использовать и понимать в вашем путешествии по JavaScript. Недавно я наткнулся на задачу кода, которая требовала, чтобы вы построили reduce() с нуля — это было довольно просто, но затем я наткнулся на задачу, которая требовала, чтобы я вернул новый массив с элементами, найденными во всех входных данных (многомерный массив) с помощью сокращения. До этой задачи я знал только, что функция reduce суммирует общее количество чисел в массиве и ничего больше. Я понятия не имел, что у него есть какие-то другие функции. Давайте продолжим и погрузимся в это сейчас…
Что такое уменьшить?
Reduce — метод, который выполняет функцию reducer (предоставленную вами) для каждого элемента массива, в результате чего получается одно выходное значение.
Документация MDN
Если упростить, то reduce принимает функцию, просматривает каждый элемент внутри массива и выполняет действие, основанное на предоставленной вами функции, и возвращает один элемент.
Функция, которую мы ей предоставляем, имеет 4 параметра, 2 из которых являются необязательными. накопитель(общая сумма), currentValue(текущий элемент), индекс(текущая позиция элемента в массиве), массив(было вызвано сокращение массива).
Редьюсер не только принимает функцию в качестве аргумента, но и имеет второй необязательный аргумент, называемый initialValue. По умолчанию, если initialValue не был указан, он устанавливается на первый элемент массива, в противном случае он устанавливается на предоставленное значение; это может быть объект, массив, строка или число.
const array = [1, 2, 3]; const initialValue = 10; // WITHOUT AN INITIALVALUE array.reduce( (accumulator, currentValue) => { return accumulator + currentValue; }); // returns 6 // WITH AN INITIALVALUE SET TO 10 array.reduce( function(accumulator, currentValue) { return accumulator + currentValue; }, initialValue); // returns 16
Создание сокращения
Один из лучших способов понять итераторы — создать их самостоятельно. Мы уже знаем, как использовать сокращение, но чтобы действительно понять, что происходит за кулисами — мы собираемся воссоздать его.
function reduce(array, callback, initialValue) { if ( Array.isArray(array) ) { let accumulator; if (initialValue === undefined) { accumulator = array[0]; array = array.slice(1); } else { accumulator = initialValue; } array.forEach( ele => { accumulator = callback(accumulator, ele); }) return accumulator; } else { return "TypeError: First argument must be an array." } }
Мы знаем, что сокращение можно использовать только для массива, поэтому мы сначала проверяем, является ли это массивом или нет, и если это не так, мы просто выдаем ошибку. Затем мы хотим проверить, было ли предоставлено initialValue, если это так, мы устанавливаем накопитель в initialValue, в противном случае мы устанавливаем accumulator к первому элементу массива, и мы начинаем нашу первую итерацию с индекса 1 вместо 0. Наконец, мы перебираем массив и выполняем обратный вызов, передавая аккумулятор и текущий элемент.
Тестирование Уменьшить
Если вы все еще не совсем понимаете, попробуйте возиться с реальным итератором сокращения и получить ошибки.
Вызов сокращения для других типов данных
let someObj = {a: 1, b: 2, c: 3}; let someNum = 4; let someString = "Hello"; let someArray = [1, 2, 3]; someObj.reduce( (acc, val) => acc + val) // TypeError someNum.reduce( (acc, val) => acc + val) // TypeError someString.reduce( (acc, val) => acc + val) // TypeError someArray.reduce( (acc, val) => acc + val) // 6
Передача только одного аргумента
const arr = ['a', 'b', 'c', 'a']; arr.reduce( acc => { return acc; }) // returns 'a'; arr.reduce( acc => { return 1 + acc; }) // returns '1111a' arr.reduce( acc => { return acc; }, []) // returns []
Пересматривая наш предыдущий код
вернуть новый массив с элементами, найденными во всех входных данных (многомерный массив), используя сокращение
const arr1 = [5, 10, 15, 20]; const arr2 = [15, 88, 1, 5, 7]; const arr3 = [1, 10, 15, 5, 20]; console.log(intersection([arr1, arr2, arr3])); // should log: [5, 15]
Ответ
function intersection(arr) { const common = []; const obj = arr.flat().reduce( (all, ele) => { ele in all ? all[ele]++ : all[ele] = 1; return all; }, {}) for (let key in obj) { obj[key] === arr.length ? common.push(parseInt(key)) : null } return common; }
Вот вам ребята! Надеюсь, я упростил для вас использование сокращения не только для суммирования чисел. Вы можете сгладить многомерный массив, вести подсчет элементов в объекте и т. д. И не забудьте хлопнуть в ладоши!