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]));