JavaScript Array flat() (陣列扁平化)

陣列 (array) 的 flat() 方法用來將巢狀的陣列「攤平」成一維陣列。

語法:

var newArray = arr.flat([depth])
  • depth 是指定要攤平的深度,預設是 1

基本用法

var arr = [1, 2, [3, 4]];

arr.flat();
// [1, 2, 3, 4]

指定攤平深度

var arr = [1, [2, [3, [4]]]];

arr.flat(1);  // [1, 2, [3, [4]]]
arr.flat(2);  // [1, 2, 3, [4]]
arr.flat(3);  // [1, 2, 3, 4]

完全攤平

使用 Infinity 可以攤平任意深度的巢狀陣列:

var arr = [1, [2, [3, [4, [5]]]]];

arr.flat(Infinity);
// [1, 2, 3, 4, 5]

移除陣列中的空項目

flat() 會移除陣列中的空項目 (empty slots):

var arr = [1, 2, , 4, 5];

arr.flat();
// [1, 2, 4, 5]

實際應用

// 合併多個使用者的訂單
var usersOrders = [
    [{ id: 1, item: 'Book' }],
    [{ id: 2, item: 'Pen' }, { id: 3, item: 'Notebook' }],
    [{ id: 4, item: 'Pencil' }]
];

var allOrders = usersOrders.flat();
// [{ id: 1, item: 'Book' }, { id: 2, item: 'Pen' }, { id: 3, item: 'Notebook' }, { id: 4, item: 'Pencil' }]

flatMap()

flatMap() 是 map() 和 flat(1) 的結合,先對每個元素執行 map,然後將結果攤平一層:

var sentences = ['Hello World', 'How are you'];

// 用 map 會得到巢狀陣列
sentences.map(function(s) {
    return s.split(' ');
});
// [['Hello', 'World'], ['How', 'are', 'you']]

// 用 flatMap 會自動攤平
sentences.flatMap(function(s) {
    return s.split(' ');
});
// ['Hello', 'World', 'How', 'are', 'you']

另一個 flatMap 範例:

var numbers = [1, 2, 3];

numbers.flatMap(function(n) {
    return [n, n * 2];
});
// [1, 2, 2, 4, 3, 6]
flat() 和 flatMap() 是 ES2019 新增的方法。flatMap() 只會攤平一層,無法指定深度。