Деструктуризация массива
У меня есть массив строк, в котором возможно есть еще один массив со строками и так далее. В результате мне нужно получить одномерный массив со строками из всех массивов. Вот пример кода
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);