Треки
/
JavaScript
JavaScript
/
Вправи
/
Перетворювальні чари Еліз
Перетворювальні чари Еліз

Перетворювальні чари Еліз

Навчальна вправа

Вступ

У JavaScript клас Array має багато потужних вбудованих методів для перетворення масивів. Ці методи значно полегшують перетворення одного масиву на інший, ніж якби ми робили це простим циклом for чи прямим маніпулюванням.

Деякі методи є чистими: вони не змінюють початковий масив, а натомість повертають новий. Інші ж методи змінюють масив, для якого їх викликано, і не повертають змінений масив.

Нижче наведено деякі з найуживаніших методів для перетворення масивів. Повний список доступних методів можна знайти в документації MDN.

map (чистий)

Створює новий масив, перетворюючи кожен елемент за функцією, переданою як аргумент. Такі функції зворотного виклику часто записують як стрілкові функції.

let arr = [1, 2, 3, 4];

const newArr = arr.map((value) => value - 1);
console.log(newArr);
// => [0, 1, 2, 3]
console.log(arr);
// => [1, 2, 3, 4]

Варто зауважити, що отриманий масив завжди матиме ту саму довжину, що й початковий.

filter (чистий)

Створює масив, фільтруючи наявний, за допомогою функції фільтрування (вона повертає правду, якщо елемент слід залишити, і неправду, якщо його слід прибрати).

let arr = [1, 2, 3, 4];

arr.filter((value) => value % 2 === 0);
// => [2, 4]

reduce (чистий)

Зводить масив до одного значення за допомогою функції, яка приймає акумулятор і поточний елемент масиву як параметри. Ця функція визначає, як поточний елемент потрібно приєднати до акумулятора, і повертає акумулятор, який буде використано на наступній ітерації.

let arr = [1, 2, 3, 4];

// Get the sum of elements
arr.reduce((accumulator, currentValue) => accumulator + currentValue, 0);
// => 10

// Classify the numbers by whether they are odd or not
arr.reduce(
  (accumulator, currentValue) => {
    if (currentValue % 2 === 0) {
      accumulator.even.push(currentValue);
    } else {
      accumulator.odd.push(currentValue);
    }

    return accumulator;
  },
  { even: [], odd: [] },
);
// => { even: [2, 4], odd: [1, 3] }

reverse

Змінює порядок елементів масиву на зворотний.

const arr = [1, 2, 3, 4];

arr.reverse();
// => [4, 3, 2, 1]

Цей метод змінює масив, для якого його викликано.

slice (чистий)

Отримуючи початковий і кінцевий індекс, створює підмасив із масиву, переданого як параметр.

Елемент за кінцевим індексом не включається. Крім того, всі параметри необовʼязкові: початковий індекс типово дорівнює 0, а кінцевий індекс типово дорівнює довжині масиву.

const arr = [1, 2, 3, 4];

arr.slice(1, 2); // [2]
arr.slice(1); // [2, 3, 4]
// You can also use negative numbers, that represent the indexes
// starting from the end of the array
arr.slice(-2); // [3, 4]

splice

Видаляє або замінює та/або додає нові елементи масиву.

Він приймає такі параметри:

  • індекс елемента, з якого почати змінювати масив
  • кількість елементів для видалення
  • елементи, які потрібно вставити в масив (необовʼязково)

splice повертає елементи, які було видалено.

const arr = ['1', '2', '5', '6'];

// Insert an element at index 2
arr.splice(2, 0, '3');
console.log(arr);
// => ['1', '2', '3', '5', '6']

// Remove 2 elements, starting at index 3 and insert 2 elements
const removed = arr.splice(3, 2, '4', '5');
console.log(removed);
// => ['5', '6']
console.log(arr);
// => ['1', '2', '3', '4', '5']

// Remove 1 element at index 1
arr.splice(1, 1);
console.log(arr);
// => ['1', '3', '4', '5']

sort

Типово sort сортує елементи масиву, спершу перетворюючи їх на рядки тексту (англ. string), а потім застосовуючи порівняння рядків тексту (див. концепцію «Порівняння»). Сортування відбувається на місці, тобто початковий масив змінюється. sort також повертає цей змінений масив, що зручно, якщо ми хочемо приєднати до нього інші методи ланцюжком.

const arr = ['c', 'a', 'z', 'b'];
const result = arr.sort();
console.log(result);
// => ['a', 'b', 'c', 'z']
console.log(arr);
// => ['a', 'b', 'c', 'z']

Щоб налаштувати поведінку сортування, ми можемо передати функцію порівняння як аргумент. Саму функцію порівняння викликають із двома аргументами, які є двома елементами масиву. Вона має повернути таке:

  • відʼємне число, якщо перший аргумент має стояти перед другим після сортування
  • додатне число, якщо перший аргумент має стояти після другого
  • 0, якщо порядок елементів має залишитися незмінним

Ось приклад того, як за допомогою власної функції порівняння можна відсортувати масив обʼєктів.

const arr = [
  { name: 'Lydia', age: 7 },
  { name: 'Anne', age: 34 },
  { name: 'Holger', age: 59 },
];

arr.sort((item1, item2) => {
  if (item1.name < item2.name) {
    return -1;
  }
  if (item1.name > item2.name) {
    return 1;
  }
  return 0;
});
// => [ { name: 'Anne', age: 34 }, { name: 'Holger', age: 59 },
// { name: 'Lydia', age: 7 } ]

Вказівки

Еліза, майбутня чарівниця, продовжує навчання. Їй дадуть колоду карт, і вона спробує перетворити цю колоду. Вона змусить певні карти зʼявлятися, зникати, змінювати свої значення або повністю змінювати порядок. Щоб полегшити собі завдання, зазвичай вона починає лише з карт, пронумерованих від 1 до 10, хоча деякі трюки можуть створювати й більші карти.

1. Подвойте кожну карту

Еліза хоче подвоїти число на кожній карті в колоді. Унаслідок цього можуть зʼявитися карти з більшими числами, ніж від 1 до 10.

const deck = [1, 2, 3, 4, 10];
seeingDouble(deck);
// => [2, 4, 6, 8, 20]

2. Створіть кілька копій кожної 3, що трапляється в колоді

Еліза хоче потроїти кожну 3, що трапляється в колоді. Якщо в колоді була лише одна 3, то після трюку на місці початкової 3 опиняться три 3.

const deck = [1, 3, 9, 3, 7];
threeOfEachThree(deck);
// => [1, 3, 3, 3, 9, 3, 3, 3, 7]

3. Знайдіть дві карти з точної середини колоди

Еліза візьме колоду з десяти карт і змусить зникнути всі карти, крім двох середніх.

const deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
middleTwo(deck);
// => [5, 6]

4. Дві крайні карти знову опиняться в середині колоди

Еліза хоче перемістити верхню та нижню карти колоди в середину, у зворотному порядку.

Можемо припустити, що в колоді парна кількість карт.

const deck = [1, 2, 3, 5, 6, 10];
sandwichTrick(deck);
// => [2, 3, 10, 1, 5, 6]

5. Кожна карта, що не є 2, зникає

Сьогодні улюблене число Елізи - 2. У цьому трюку всі карти, які не є 2, зникнуть з колоди.

const deck = [1, 2, 3, 4, 10, 2];
twoIsSpecial(deck);
// => [2, 2]

6. Перетворіть перетасовану колоду на ідеально впорядковану

Еліза хоче продемонструвати свою майстерність у бездоганному впорядкуванні карт, хоч би як добре їх перетасували.

const deck = [10, 1, 5, 3, 2, 8, 7];
perfectlyOrdered(deck);
// => [1, 2, 3, 5, 7, 8, 10]

7. Перевпорядкуйте колоду

Еліза хоче змінити порядок карт у колоді. Після трюку карта, яка зараз лежить зверху, має опинитися внизу колоди. Друга карта має стати передостанньою тощо.

const deck = [10, 1, 5, 3, 2];
reorder(deck);
// => [2, 3, 5, 1, 10]
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
JavaScript Exercism

Час розпочати Перетворювальні чари Еліз?

Зареєструйтеся на Exercism, щоб вивчати й опановувати JavaScript, а також 37 концепцій159 вправ та справжнє наставництво від людей, і все це безкоштовно.