Làm phẳng mảng Javascript với flat() và flatMap()
Trong ES2019, phương thức flat() tạo và trả về một mảng mới cái chứa cùng các phần tử như mảng nó được gọi trên,
ngoại trừ rằng bất cứ phần tử nào cái bản thân chúng là các mảng được làm phẳng thành mảng trả về. Ví dụ:
[1, [2, 3]].flat() // => [1, 2, 3]
[1, [2, [3]]].flat() // => [1, 2, [3]]
Khi được gọi với không đối số, flat() làm phẳng một mức nesting. Các phần tử của mảng gốc cái bản thân chúng là
các mảng được làm phẳng, nhưng các phần tử mảng của các mảng đó không được làm phẳng. Nếu bạn muốn làm phẳng nhiều
mức hơn, truyền một số tới flat():
let a = [1, [2, [3, [4]]]];
a.flat(1) // => [1, 2, [3, [4]]]
a.flat(2) // => [1, 2, 3, [4]]
a.flat(3) // => [1, 2, 3, 4]
a.flat(4) // => [1, 2, 3, 4]
Phương thức flatMap() làm việc chính như phương thức map() (xem map() các học phần trước) ngoại trừ rằng mảng
trả về tự động được làm phẳng như thể truyền tới flat(). Đó là, gọi a.flatMap(f) là tương tự như (nhưng hiệu quả
hơn) a.map(f).flat():
let phrases = [“hello world”, “the definitive guide”];
let words = phrases.flatMap(phrase => phrase.split(” “));
words // => [“hello”, “world”, “the”, “definitive”, “guide”];
Bạn có thể nghĩ về flatMap() như một chung hóa của map() cái cho phép mỗi phần tử của mảng đầu vào chập với
bất cứ số phần tử nào của mảng đầu ra. Cụ thể là, flatMap() cho phép bạn chập các phần tử đầu vào vào một mảng
rỗng, cái làm phẳng thành không còn gì trong mảng đầu ra:
// Map non-negative numbers to their square roots
[-2, -1, 1, 2].flatMap(x => x < 0 ? [] : Math.sqrt(x)) // => [1, 2**0.5]
