Деструктуризация массива

У меня есть массив строк, в котором возможно есть еще один массив со строками и так далее. В результате мне нужно получить одномерный массив со строками из всех массивов. Вот пример кода

const data = ["str1", "str2", ["str1", ["str1", "str2"], "str2"], "str3"]

В результате должно получится

["str1", "str2", "str1", "str1", "str2", "str2", "str3"]

Я не понимаю как правильно сделать деструктуризацию

const data = ["str1", "str2", ["str1", ["str1", "str2"], "str2"], "str3"]
console.log(data.filter((s) => s).map((s) => (typeof s === "string" ? s : [...s])))


Ответы (4 шт):

Автор решения: Igor

const data = ["str1", "str2", ["str1", ["str1", "str2"], "str2"], "str3"];
let d1 = data;
let count = 0;
while (count != d1.length) {
  count = d1.length;
  d1 = d1.flat();
}
console.log(d1);

→ Ссылка
Автор решения: Qwertiy

Да никак её не делать:

const data = ["str1", "str2", ["str1", ["str1", "str2"], "str2"], "str3"]
console.log(data.flat(Infinity))

→ Ссылка
Автор решения: yar85

Вариант для любой вложенности массивов, полностью стандартный (без использования экспериментальных методов), без рекурсии, и главное - забавный:

const foo = arr => /[^\\]{/.test(
  arr = JSON.stringify(arr)
    .replace(/([^\\])(\[|\])+/g, '$1').replace(/,(\s*,)+/g, ',') + ']'
) ? null : JSON.parse(arr); 

console.log('Массив из вопроса: ',
  foo(["str1", "str2", ["str1", ["str1", "str2"], "str2"], "str3"])
); 
console.log('"Усложненный" массив: ',
  foo(["str1", "str2", [], [[]], [["str1", ["str1", "str2"]], "str2"], "str3"])
);

Недостаток: отсутствие обработки циклических ссылок.


// Готов к минусам за этот ответ ?

→ Ссылка
Автор решения: Leonid

Можно тоже одной строкой и рабочий вариант.

let data = ["str1", "str2", [["str1", ["str1", "str2"], "str2"]], "str3"];

while (data.some(item => Array.isArray(item))) data = data.flat();

console.log(data);

→ Ссылка