--- title: Array.prototype.flat() slug: Web/JavaScript/Reference/Global_Objects/Array/flat tags: - Массив - Ссылка - Экспериментальная - метод - прототип - яваскрипт translation_of: Web/JavaScript/Reference/Global_Objects/Array/flat ---
Метод flat()
возвращает новый массив, в котором все элементы вложенных подмассивов были рекурсивно "подняты" на указанный уровень depth.
\{{EmbedInteractiveExample("pages/js/array-flatten.html")}}
Исходный код этого интерактивного примера находится на гитхабе. Если вы желаете внести свой вклад в проект интерактивных примеров, пожалуйста, склонируйте https://github.com/mdn/interactive-examples и пришлите нам пулреквест.
var newArray = arr.flat(depth);
depth
{{optional_inline}}Новый массив с объединенными в него подмассивами.
var arr1 = [1, 2, [3, 4]]; arr1.flat(); // [1, 2, 3, 4] var arr2 = [1, 2, [3, 4, [5, 6]]]; arr2.flat(); // [1, 2, 3, 4, [5, 6]] var arr3 = [1, 2, [3, 4, [5, 6]]]; arr3.flat(2); // [1, 2, 3, 4, 5, 6] var arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]]; arr4.flat(Infinity); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Метод flat удаляет пустые слоты из массива:
var arr4 = [1, 2, , 4, 5]; arr4.flat(); // [1, 2, 4, 5]
reduce
и concat
var arr1 = [1, 2, [3, 4]]; arr1.flat(); // В одномерный массив arr1.reduce((acc, val) => acc.concat(val), []);// [1, 2, 3, 4] //или const flatSingle = arr => [].concat(...arr);
// Для развертывания многомерных массивов используем рекурсию, reduce и concat const arr = [1, 2, [3, 4, [5, 6]]]; function flatDeep(arr, d = 1) { return d > 0 ? arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatDeep(val, d - 1) : val), []) : arr.slice(); }; flatDeep(arr, Infinity); // [1, 2, 3, 4, 5, 6]
//не рекурсивное упрощение с использованием стэка var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]]; function flatten(input) { const stack = [...input]; const res = []; while (stack.length) { // забираем последнее значение const next = stack.pop(); if (Array.isArray(next)) { // добавляем к массиву элементы не модифицируя исходное значение stack.push(...next); } else { res.push(next); } } //разворачиваем массив, чтобы восстановить порядок элементов return res.reverse(); } flatten(arr1);// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
//рекурсивно упрощаем массив function flatten(array) { var flattend = []; (function flat(array) { array.forEach(function(el) { if (Array.isArray(el)) flat(el); else flattend.push(el); }); })(array); return flattend; }
Пожалуйста, не добавляйте полифилы в эту статью: https://discourse.mozilla.org/t/mdn-rfc-001-mdn-wiki-pages-shouldnt-be-a-distributor-of-polyfills/24500
Спецификация | Статус | Комментарий |
---|---|---|
Array.prototype.flat proposal |
Кандидат (3) |
{{Compat("javascript.builtins.Array.flat")}}