В этой статье мы находимся в мире MajScript, разработчики - это волшебники (называемые MajScript), которые пишут некоторые заклинания (коды) на свитках, чтобы активировать магию. Многие MajScript присоединяются к лиге разработчиков, которые собирают лучший MajScript в мире для выполнения клиентских миссий!

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

Здесь я беру шесть карт, у каждой карты свой номер, от 1 до 6, покажите мне свои навыки и дайте мне только четные карты.

Что будешь использовать? … forEach?

Хорошо, давай покажем мне:

const cards = [ 1, 2, 3, 4, 5, 6 ]
const evenCards = []
// I’m asking you to filter the array with only even number
cards.forEach(currentNumber => {
    // If even number
    if (currentNumber % 2 === 0) {
        evenCards.push(currentNumber)
    }
})
evenCards // [ 2, 4, 6 ]

💡 В интервью, если люди просят вас найти более быстрый способ узнать, является ли число четным или нечетным, используйте не по модулю, а бинарный оператор, поскольку `currentNumber & 1` равно` currentNumber% 2 === 0`, бинарный оператор быстрее, чем по модулю, так как это бинарная операция!

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

1) Вам нужно вставить значение в другой массив, поскольку forEach НЕ возвращает какое-либо значение, поскольку forEach похож на цикл for!

2) Если другой кодировщик просматривает ваш код, он должен понимать контекст, а с forEach разработчику не совсем ясно, что вы хотите отфильтровать значение непосредственно в другой массив.

Вам удается обработать мой запрос, но вам нужно знать больше вариантов, forEach хорош, но не в такой ситуации ...

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

const myArray = [ 1, 2, 3 ]
myArray.forEach(currentNumber => {
    console.log(currentNumber) // 1, 2, 3
})

Разрешите представить первое первое заклинание, я имею в виду Фильтр!

1) Фильтр прототипа заклинания:

Фильтр принимает один аргумент, например forEach, это обратный вызов (это просто простая функция) и возвращаемый массив с отфильтрованным значением .

array.filter (обратный вызов)

Аргумент:

  • обратный вызов принимает t три аргумента: текущий элемент, индекс и массив повторяются.

Возврат:

  • массив с отфильтрованным значением

⚠️ Не забывайте возвращать логическое значение на каждой итерации!

Как использовать:

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

Когда использовать:

Если вы хотите отфильтровать значение из массива, в зависимости от вашего состояния.

Я покажу вам решение с фильтром:

const cards = [ 1, 2, 3, 4, 5, 6 ]
// Filter the array with only even number
const evenCards = cards.filter(currentNumber => {
    // If even number
    const isEvenNumber = currentNumber % 2 === 0
    return isEvenNumber
}) 
evenCards // [ 2, 4, 6 ]

Это заклинание такое потрясающее! Вы можете легко отфильтровать значение в массиве

Теперь мы знаем, как фильтровать, но пришло время узнать, как преобразовать!

Итак, как вы можете видеть на этих картах, каждая карта имеет свой тип (Spade ♠, Heart ♥, Diamond ♦, Clubs ♣), как вы можете преобразовать все карты в Heart ♥?

Хм… Я вижу, что ты будешь использовать forEach? Опять таки? Нет !!

Посмотрим еще одно заклинание ...

2) Заклинание прототипа карты:

Карта принимает один аргумент, например forEach и filter, это обратный вызов (это просто простая функция) и возвращаемый массив с преобразованным значение.

map.filter (обратный вызов)

Аргумент:

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

Возврат:

  • массив с преобразованным значением

⚠️ Не забывайте возвращать преобразованный элемент на каждой итерации!

Как использовать:

На каждой итерации вы должны возвращать преобразованный элемент.

Когда использовать:

Если вы хотите преобразовать значение из массива. Вы также можете преобразовать объект в значение (после этого мы увидим).

const cards = [
    { type: “spade”, number: 1 },
    { type: “heart”, number: 2 },
    { type: “diamond”, number: 3 },
    { type: “spade”, number: 4 },
    { type: “diamond”, number: 5 },
    { type: “clubs”, number: 6 },
]
// Let’s transform all types into heart type
const cardsWithOnlyHeart = cards
.map(card => {
    if (card.type !== “heart”) {
        card.type = “heart”
    }
    return card
})
cardsWithOnlyHeart
// [
//     { type: “heart”, number: 1 },
//     { type: “heart”, number: 2 },
//     { type: “heart”, number: 3 },
//     { type: “heart”, number: 4 },
//     { type: “heart”, number: 5 },
//     { type: “heart”, number: 6 },
// ]

Как видите, магия javascript позволяет нам использовать разные заклинания для создания разных вещей!

Важно знать! Вы можете связать свои заклинания! Удивительно, нет? давай увидим это !

Вы можете попытаться дать мне все числа из ромбовидного шрифта?

const cards = [
    { type: “spade”, number: 1 },
    { type: “heart”, number: 2 },
    { type: “diamond”, number: 3 },
    { type: “spade”, number: 4 },
    { type: “diamond”, number: 5 },
    { type: “clubs”, number: 6 },
]
// Let’s give me all number from diamond type
const numberFromDiamondCard = cards
// First filter card that are not diamond type
.filter(card => {
    const isDiamondType = card.type === “diamond”
    return isDiamondType
})
// Then transform diamond card object into number
.map(diamondCard => {
    return diamondCard.number
}) 
numberFromDiamondCard
// [ 3, 5 ]

Когда вы связываете функцию, параметры второй связанной функции являются результатом первой цепочки!

Очень хорошо ! твоя магия потрясающая! У вас большой потенциал, вы можете связать все заклинания массива прототипов!

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

3) Уменьшить заклинание прототипа:

Чтобы быть ясным с вами, я не понимаю непосредственно заклинание уменьшения, когда выучу его, но, наконец, я нашел хорошее объяснение, поэтому, когда вы хотите получить одно значение из массива, используйте уменьшить!

Аргументы:

Функция Reduce принимает * два аргумента * в отличие от forEach / filter / map, а именно:

  • обратный вызов: принимает четыре аргумента: аккумулятор, текущий элемент, индекс и повторяемый массив.
  • начальное значение аккумулятора (возврат значения уменьшением).

Возврат:

  • аккумулятор

⚠️ Не забывайте возвращать аккумулятор на каждой итерации!

Как использовать:

На каждой итерации вы должны возвращать аккумулятор.

Когда использовать:

Если вы хотите получить одно значение из массива.

Вы должны быстро понять это заклинание.

Я просуммирую все достоинства моих карт!

const cards = [ 1, 2, 3, 4, 5, 6 ]
const INITIAL_VALUE = 0
// Let’s have the sum of these cards
const sumOfCards = cards
.reduce((accumulator, currentCard) => {
    return accumulator += currentCard
}, INITIAL_VALUE)
sumOfCards // 21

Примечание. Аккумулятор может быть объектом.

Поздравляем, вы овладеваете силой triforce, используете эту функцию в специальном контексте и улучшаете свой код!

Поскольку вы очень быстро научитесь, я дам вам несколько советов, это еще два заклинания, очень полезно.

4) Некоторые и все прототипы заклинаний:

Узнал не так давно, но эти заклинания очень полезны! Вы должны использовать как можно больше, но только в одном контексте!

Вы хотите знать, соответствует ли ваш массив условию? Используйте немного или каждые в зависимости от условия.

Некоторые

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

Например:

const cards = [
    { type: “spade”, number: 1 },
    { type: “heart”, number: 2 },
    { type: “diamond”, number: 3 },
    { type: “spade”, number: 4 },
    { type: “diamond”, number: 5 },
    { type: “clubs”, number: 6 },
]
const isCardsHasAtLeastOneHeart = cards.some(card => {
    return card.type === “heart”
})
isCardsHasAtLeastOneHeart // true

Когда использовать:

Используйте его, если вы хотите увидеть, соответствует ли ваш массив в зависимости от условия, если вы действительно хотите знать, когда его использовать, задайте вам этот вопрос:

Нужно ли мне использовать функцию поиска и проверять, не определено ли значение, но не использовать это значение?

const myArray = [ 1, 2, 4, 8 ]
const eight = myArray.find(item => item === 8)
if (!!eight) {
    // do logic and don't use eight variable
}
< === >
const myArray = [ 1, 2, 4, 8 ]
const hasEightInArray = myArray.some(item => item === 8)
if (!!hasEightInArray) {
    // do logic
}

Каждые

Похоже, что некоторые, но every вернет true, если все элементы в массиве соблюдают условие!

  • Если одно условие не выполнено, каждое вернет false!

Вместо некоторых, которые возвращают true, если хотя бы один элемент в массиве соблюдает условие!

  • Если все проходят условие, некоторые вернут false!

Используйте правильное заклинание в зависимости от контекста!

5) Краткий обзор своего путешествия

Заклинания:

  • forEach = ›Используйте это, если вы не хотите изменять значение в этом или получать массив из этого.
  • filter = ›Используйте, если вы хотите отфильтровать значение из массива в зависимости от вашего условия.
  • map = ›Используйте его, когда вам нужно преобразовать значение из массива.
  • reduce = ›Используйте, если вы хотите получить одно значение из массива.
  • some = ›Используйте его, чтобы проверить, соответствует ли массив вашему условию для хотя бы элемента.
  • every = ›Используйте его, чтобы проверить, соответствует ли массив вашему условию для всех элементов.

Примечание. Для real, foreach, filter, map и reduce примите еще один аргумент, это this контекст, но я не объяснял его в этой статье.

Надеюсь, вам понравятся статьи такого рода, не стесняйтесь оставлять свои отзывы или любые предложения в комментариях!

Моя цель - написать новую статью, связанную с этой историей!

Следуй за мной на:

Twitter: https://twitter.com/MajScript

Instagram: https://www.instagram.com/majscript/

Github: https://github.com/MajScript