середняarraysrecursionalgorithms

Сплощення вкладених масивів (Array Flatten)

Завдання на створення функції для сплощення багаторівневих масивів

Сплощення вкладених масивів (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)Найкоротший, вбудований метод
reduceO(n)O(d)Функціональний стиль
ІтеративнийO(n)O(n)Уникає переповнення стеку

де n - загальна кількість елементів, d - глибина вкладеності

Питання для обговорення

  1. Як би ви обробили випадок з нескінченною рекурсією?
  2. Що станеться, якщо масив містить не тільки числа, але й інші типи даних?
  3. Як би ви оптимізували рішення для дуже великих масивів?
  4. Чи можна модифікувати функцію для контролю глибини сплощення?

Варіації завдання

  • Сплощення тільки на один рівень
  • Сплощення з фільтрацією певних елементів
  • Сплощення об'єктів замість масивів