--- title: Array.prototype.flat() slug: Web/JavaScript/Reference/Global_Objects/Array/flat tags: - Array - JavaScript - Method - Prototype - Reference - flat translation_of: Web/JavaScript/Reference/Global_Objects/Array/flat ---
flat() メソッドは、すべてのサブ配列の要素を指定した深さで再帰的に結合した新しい配列を生成します。
var newArray = arr.flat([depth]);
depth {{optional_inline}}サブ配列の要素を結合した新しい配列。
const arr = [1, 2, [3, 4]]; // 単一レベルの配列にする arr.flat(); // 次のものと同様 arr.reduce((acc, val) => acc.concat(val), []); // [1, 2, 3, 4] // または、分割代入の構文を使用して const flattened = arr => [].concat(...arr);
const arr = [1, 2, [3, 4, [5, 6]]];
// reduce と concat の再帰によって深いレベルを平坦化することができる
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]
// 再帰を使わずにスタックを使用して平坦化
// note that depth control is hard/inefficient as we will need to tag EACH value with its own depth
// also possible w/o reversing on shift/unshift, but array OPs on the end tends to be faster
function flatten(input) {
const stack = [...input];
const res = [];
while(stack.length) {
// pop value from stack
const next = stack.pop();
if(Array.isArray(next)) {
// push back array items, won't modify the original input
stack.push(...next);
} else {
res.push(next);
}
}
// reverse to restore input order
return res.reverse();
}
const arr = [1, 2, [3, 4, [5, 6]]];
flatten(arr);
// [1, 2, 3, 4, 5, 6]
function* flatten(array, depth) {
if(depth === undefined) {
depth = 1;
}
for(const item of array) {
if(Array.isArray(item) && depth > 0) {
yield* flatten(item, depth - 1);
} else {
yield item;
}
}
}
const arr = [1, 2, [3, 4, [5, 6]]];
const flattened = [...flatten(arr, Infinity)];
// [1, 2, 3, 4, 5, 6]
この記事にポリフィルを追加しないでください。参考までに、https://discourse.mozilla.org/t/mdn-rfc-001-mdn-wiki-pages-shouldnt-be-a-distributor-of-polyfills/24500 をチェックしてください。
const arr1 = [1, 2, [3, 4]]; arr1.flat(); // [1, 2, 3, 4] const arr2 = [1, 2, [3, 4, [5, 6]]]; arr2.flat(); // [1, 2, 3, 4, [5, 6]] const arr3 = [1, 2, [3, 4, [5, 6]]]; arr3.flat(2); // [1, 2, 3, 4, 5, 6] const 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 メソッドは配列内の空要素を削除します。
const arr5 = [1, 2, , 4, 5]; arr5.flat(); // [1, 2, 4, 5]
| 仕様書 |
|---|
| {{SpecName('ESDraft', '#sec-array.prototype.flat', 'Array.prototype.flat')}} |
{{Compat("javascript.builtins.Array.flat")}}