Пишите более чистый и короткий код

Я недавно написал это.

Многие младшие разработчики и новички в JavaScript часто спрашивают: «Зачем нам нужно разбивать вещи на множество методов, таких как map, filter, find иreduce? Почему бы нам просто не использовать цикл for? Он может обрабатывать все виды логики, которые предоставляют эти методы массива ».

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

Прежде чем объяснять почему, я хочу познакомить вас с некоторыми новыми концепциями.

Бесточечный стиль

Бесточечный стиль - это метод, который улучшает читаемость за счет устранения ненужных аргументов.

Давайте посмотрим на этот код:

const scores = [3,1,5,7,9]
const goodScores = scores.filter(function(score){ 
  return score >= 7
})

Ага, легко понять; эта функция помогает нам отфильтровывать оценки ≥ 7. Мы можем сделать это лучше:

const scores = [3,1,5,7,9]
const isGoodScore = score => score >= 7
const goodScores = scores.filter(score => isGoodScore(score))

Ага, лучше назвать функцию isGoodScore. Но мы можем сделать это еще лучше, используя безточечный стиль.

const scores = [3,1,5,7,9]
const isGoodScore = score => score >= 7
const goodScores = scores.filter(isGoodScore)

Видите, мы можем обрезать аргументы и сделать это так. Код

const goodScores = scores.filter(isGoodScore)

гораздо больше похож на человеческий язык, понятный для всех и короче.

Карри-функции

Каррированная функция - это функция, которая принимает несколько аргументов по одному.

Это нормальная функция:

const add = (a, b, c) => a + b + c
add(1,2,3) // This will return 6

Это функция карри:

const add = a => b => c => a + b + c
add(1)(2)(3) // This will also return

Итак, зачем нам каррированные функции и как они помогают лучше писать код?

Хорошо, я много лет думал об этих вопросах и объясню на этом примере:

const scores = [3,1,5,7,9]
const isGoodScore = score => score >= 7
const goodScores = scores.filter(isGoodScore)

Возьмем предыдущий пример. Что, если мы хотим отдельно отфильтровать оценки, равные 1, 2… вплоть до 10? Можно определить десять функций isEqual1 isEqual10, но с каррированными функциями мы можем улучшить их, имея только одну функцию с именем isEqual. Код будет выглядеть так:

const scores = [3,1,5,7,9,1,5]
const isEqual = compareValue => score => score === compareValue
const scoresEqual1 = scores.filter(isEqual(1))

Потрясающие. : D Больше не нужно писать десять разных функций.

На всякий случай, если вы не знакомы с функциями жирных стрелок, приведенные выше каррированные функции можно переписать следующим образом:

const isEqual = function(compareValue){
  return function(score){ 
    return score === compareValue
  }
}

Итак, я думаю, вы теперь понимаете бесточечный стиль и каррированные функции. Давайте создадим функцию addToCart, используя for цикл.

Видите ли, мы используем цикл for для поиска продукта в массиве products и массиве shoppingCart. Затем мы проверяем, есть ли этот продукт в shoppingCart. Если так, мы увеличиваем количество; в противном случае мы добавляем этот продукт в shoppingCart.

Давайте переделаем его с помощью find метода, бесточечного стиля и каррированных функций.

Видите ли, вместо 25 строк кода с for циклом теперь нам нужно только 14 строк с find и безточечным стилем. И, конечно же, эта функция лучше во многих аспектах, таких как удобочитаемость и чистота. Функцию productById можно также повторно использовать во многих других местах.

Более

Используя методы массива и стиль без точек, мы можем написать более чистый код, например:

const products = [....] //An array of product object
const toProductView = product => (
  {
    title: product.name + ' ' + product.brand, 
    price: product.newPrice
  }
const isValid = product => product.price > 0
const displayProducts = products.filter(isValid).map(toProductView)

Надеюсь, вы уловили идею использования методов массива в безточечном стиле. Вы можете потренироваться, открыв текущий проект и заменив for циклы методами массива и функциями обратного вызова безточечным стилем.

Спасибо за прочтение.