Funkcja Array.from ma w sobie więcej ciekawych zastosowań, niż się to na pierwszy rzut oka wydaje. Do dzieła.
Ok, prosta zamiana tablicopodobnego (w sumie napisu) na tablicę:
console.log(Array.from('foo'));
// Expected output: Array ["f", "o", "o"]
Teraz zamiana z funkcją map, takie list comprehension w JS:
console.log(Array.from([1, 2, 3], (x) => x + x));
// Expected output: Array [2, 4, 6]
Ok, wrzućmy obiekt tablicopodobny w Array.from:
console.log(Array.from({length: 2, 0: "a", 1: "b"}))
//["a", "b"]
Teraz dodajmy funkcję map, ale zabierzmy z tablicopodobnego wszystko poza długością:
Array.from({length: 3}, (v, i) => console.log(v, i));
// undefined 0
// undefined 1
// undefined 2
Wykonał się 3 razy, wartość to undefined. Jest tam undefined i jako że zwracamy zostaje tam undefined…
Ok, zwróćmy coś:
let arr321 = Array.from({length: 3}, (v, i) => 42);
console.log(arr321);
//[ 42, 42, 42 ]
Po co się takich „głupot” uczymy? Choćby po coś takiego:
const chunk = (arr, size) =>
Array.from({ length: Math.ceil(arr.length / size) }, (v, i) =>
arr.slice(i * size, i * size + size)
);
console.log(chunk([1, 2, 3, 4, 5], 2));
// [[1, 2], [3, 4], [5]]
Mamy tutaj 3 elementy:
- pierwszy to arr.slice(0,2)
- drugi to arr.slice(2,4)
- trzeci to arr.slice(4,6)
Kod z internetu i o dziwo bardzo elegancki. Dla takich kodów warto znać dobrze język, którego się używa.