JavaScript · Синтаксис · Проміжний
Деструктуризація і spread
Витягуйте значення з масивів та об'єктів в одному рядку. Охоплює деструктуруючі присвоєння, оператор spread та rest-параметри.
Короткий вступ до теми та пояснення перед вправами (вправи нижче):
Rest-параметри, spread у масивах і об'єктах, пастка поверхневої копії
#Практичні патерни: обмін, minMax, omit, pick, злиття конфігурацій
#Вправи:
Деструктуризація масиву
#Напишіть функцію, яка приймає масив з принаймні трьох елементів і повертає об'єкт з властивостями first, second і rest (масив решти елементів). Використайте деструктуризацію масиву.
function splitArray(arr) {
}
console.log(splitArray([1, 2, 3, 4, 5]));
Рішення
function splitArray(arr) {
const [first, second, ...rest] = arr;
return { first, second, rest };
}
console.log(splitArray([1, 2, 3, 4, 5]));
Деструктуризація об'єкта
#Напишіть функцію, яка приймає об'єкт користувача (з властивостями name, age та email) і повертає рядок-привітання, використовуючи лише name і age. Використайте деструктуризацію об'єкта в параметрах функції.
function greetUser({ name, age }) {
}
console.log(greetUser({ name: "Alice", age: 30, email: "[email protected]" }));
Рішення
function greetUser({ name, age }) {
return `Hello, ${name}! You are ${age} years old.`;
}
console.log(greetUser({ name: "Alice", age: 30, email: "[email protected]" }));
Обмін змінних
#Напишіть функцію, яка приймає два значення і повертає їх у зміненому порядку. Використайте деструктуризацію масиву для обміну в одному рядку.
function swap(a, b) {
}
console.log(swap(1, 2));
console.log(swap("hello", "world"));
Рішення
function swap(a, b) {
[a, b] = [b, a];
return [a, b];
}
console.log(swap(1, 2));
console.log(swap("hello", "world"));
Об'єднання об'єктів
#Напишіть функцію, яка приймає два об'єкти і повертає новий об'єкт, що містить усі властивості обох. Якщо властивість є в обох, перемагає значення другого об'єкта. Використайте оператор spread.
function mergeObjects(obj1, obj2) {
}
console.log(mergeObjects({ a: 1, b: 2 }, { b: 3, c: 4 }));
Рішення
function mergeObjects(obj1, obj2) {
return { ...obj1, ...obj2 };
}
console.log(mergeObjects({ a: 1, b: 2 }, { b: 3, c: 4 }));
Клонування та оновлення
#Напишіть функцію, яка приймає об'єкт користувача і нове ім'я, та повертає новий об'єкт — копію користувача з оновленим іменем. Не змінюйте оригінал. Використайте оператор spread.
function updateName(user, newName) {
}
const user = { name: "Alice", age: 30, role: "admin" };
const updated = updateName(user, "Bob");
console.log(user);
console.log(updated);
Рішення
function updateName(user, newName) {
return { ...user, name: newName };
}
const user = { name: "Alice", age: 30, role: "admin" };
const updated = updateName(user, "Bob");
console.log(user);
console.log(updated);
Значення за замовчуванням у деструктуризації
#Напишіть функцію, яка приймає об'єкт конфігурації і повертає об'єкт налаштувань із застосованими значеннями за замовчуванням: theme за замовчуванням 'light', fontSize — 16, language — 'en'.
function applyDefaults(config) {
}
console.log(applyDefaults({ theme: 'dark' }));
console.log(applyDefaults({ fontSize: 20, language: 'uk' }));
Рішення
function applyDefaults({ theme = 'light', fontSize = 16, language = 'en' } = {}) {
return { theme, fontSize, language };
}
console.log(applyDefaults({ theme: 'dark' }));
console.log(applyDefaults({ fontSize: 20, language: 'uk' }));
Spread у виклику функції
#Напишіть функцію, яка приймає масив чисел і повертає найбільше з них, використовуючи Math.max() з оператором spread (Math.max не приймає масив безпосередньо).
function maxValue(numbers) {
}
console.log(maxValue([3, 1, 4, 1, 5, 9, 2, 6]));
Рішення
function maxValue(numbers) {
return Math.max(...numbers);
}
console.log(maxValue([3, 1, 4, 1, 5, 9, 2, 6]));
Rest-параметри
#Напишіть функцію sum(...numbers), яка приймає будь-яку кількість аргументів і повертає їхню суму.
function sum(...numbers) {
}
console.log(sum(1, 2, 3));
console.log(sum(10, 20, 30, 40, 50));
Рішення
function sum(...numbers) {
return numbers.reduce((acc, n) => acc + n, 0);
}
console.log(sum(1, 2, 3));
console.log(sum(10, 20, 30, 40, 50));
Перейменування при деструктуризації
#Напишіть функцію, яка приймає об'єкт продукту (з властивостями 'name' і 'price') і повертає новий об'єкт з перейменованими властивостями 'title' і 'cost'. Використайте деструктуризацію з перейменуванням.
function renameProduct(product) {
}
console.log(renameProduct({ name: "Widget", price: 9.99 }));
Рішення
function renameProduct(product) {
const { name: title, price: cost } = product;
return { title, cost };
}
console.log(renameProduct({ name: "Widget", price: 9.99 }));
Об'єднання масивів без дублікатів
#Напишіть функцію, яка приймає два масиви і повертає новий масив з усіма унікальними значеннями обох у порядку (без дублікатів). Використайте spread і Set.
function uniqueMerge(arr1, arr2) {
}
console.log(uniqueMerge([1, 2, 3, 4], [3, 4, 5, 6]));
Рішення
function uniqueMerge(arr1, arr2) {
return [...new Set([...arr1, ...arr2])];
}
console.log(uniqueMerge([1, 2, 3, 4], [3, 4, 5, 6]));