Сплощення вкладених масивів (Array Flatten)
Постановка завдання
Напишіть функцію flattenArray(), яка приймає багаторівневий масив і повертає одновимірний масив з усіма елементами.
Приклади
// Вхідні дані
const nestedArray = [1, [2, 3], [4, [5, 6]], 7];
// Очікуваний результат
[1, 2, 3, 4, 5, 6, 7]
// Складний приклад
const complexArray = [1, [2, [3, [4, 5]]], 6, [7, 8]];
// Очікуваний результат
[1, 2, 3, 4, 5, 6, 7, 8]
Розв'язання 1: Рекурсивний підхід
function flattenArray(arr) {
const result = [];
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
// Рекурсивно обробляємо вкладений масив
result.push(...flattenArray(arr[i]));
} else {
result.push(arr[i]);
}
}
return result;
}
// Тестування
console.log(flattenArray([1, [2, 3], [4, [5, 6]], 7]));
// [1, 2, 3, 4, 5, 6, 7]
Розв'язання 2: Використання flat()
function flattenArray(arr) {
return arr.flat(Infinity);
}
// Тестування
console.log(flattenArray([1, [2, 3], [4, [5, 6]], 7]));
// [1, 2, 3, 4, 5, 6, 7]
Розв'язання 3: Використання reduce
function flattenArray(arr) {
return arr.reduce((acc, item) => {
return acc.concat(Array.isArray(item) ? flattenArray(item) : item);
}, []);
}
// Тестування
console.log(flattenArray([1, [2, 3], [4, [5, 6]], 7]));
// [1, 2, 3, 4, 5, 6, 7]
Розв'язання 4: Ітеративний підхід зі стеком
function flattenArray(arr) {
const result = [];
const stack = [...arr];
while (stack.length > 0) {
const next = stack.pop();
if (Array.isArray(next)) {
stack.push(...next);
} else {
result.push(next);
}
}
return result.reverse();
}
// Тестування
console.log(flattenArray([1, [2, 3], [4, [5, 6]], 7]));
// [1, 2, 3, 4, 5, 6, 7]
Аналіз складності
| Розв'язання | Часова складність | Просторова складність | Переваги |
|---|---|---|---|
| Рекурсивний | O(n) | O(d) | Зрозумілий, класичний підхід |
| flat() | O(n) | O(n) | Найкоротший, вбудований метод |
| reduce | O(n) | O(d) | Функціональний стиль |
| Ітеративний | O(n) | O(n) | Уникає переповнення стеку |
де n - загальна кількість елементів, d - глибина вкладеності
Питання для обговорення
- Як би ви обробили випадок з нескінченною рекурсією?
- Що станеться, якщо масив містить не тільки числа, але й інші типи даних?
- Як би ви оптимізували рішення для дуже великих масивів?
- Чи можна модифікувати функцію для контролю глибини сплощення?
Варіації завдання
- Сплощення тільки на один рівень
- Сплощення з фільтрацією певних елементів
- Сплощення об'єктів замість масивів