Использование сокращения в 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;
}

Вот вам ребята! Надеюсь, я упростил для вас использование сокращения не только для суммирования чисел. Вы можете сгладить многомерный массив, вести подсчет элементов в объекте и т. д. И не забудьте хлопнуть в ладоши!