JavaScript "rest operatorn (...)"

Permalänk

JavaScript "rest operatorn (...)"

Jag hittade ett exempel för att hitta det största id:t i en array av objeket nedan och det fungerar som det ska. Men jag förstår inte riktigt hur rest operatorn funkar i det här fallet. Jag provade att ändra till "Math.max(notes.map(n => n.id))"
Men det fungerade inte, vad är det som skiljer notes från ...notes?

const maxId = notes.length > 0 ? Math.max(...notes.map(n => n.id)) : 0

Permalänk
Medlem

Här finns dokumentation om Spread syntaxen(...)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer...

Visa signatur

| EVGA Z170 FTW | i7 6700k | ASUS RTX 3070 | 16GB DDR4 3200MHz | Cooler Master V850 | Samsung 840 Evo 250GB + 2x WD Black 500GB + Seagate 2TB SSHD + Samsung 970 Evo M.2 500GB |

Permalänk
Medlem
Skrivet av burton666:

Jag hittade ett exempel för att hitta det största id:t i en array av objeket nedan och det fungerar som det ska. Men jag förstår inte riktigt hur rest operatorn funkar i det här fallet. Jag provade att ändra till "Math.max(notes.map(n => n.id))"
Men det fungerade inte, vad är det som skiljer notes från ...notes?

const maxId = notes.length > 0 ? Math.max(...notes.map(n => n.id)) : 0

Det spread operatorn gör är att sprida ut alla värden från en array. Då Math.max() inte kan ta en array som inparameter så kan du sprida ut alla värden, då blir det istället Math.max(1,2,3,4,5,6,7) osv.

Det du gör ovan är att du hämtar alla idn via map() som en ny array, sen sprider du ut alla värden som inparametrar till Math.max(), skippar du spread så blir det en array och då fungerar det inte.

Det kan dock bli problem om du har för många värden, jag hade rekommenderat att använda reduce() istället.

const maxValue = arr.reduce((a, b) => { return Math.max(a, b); });

Skickades från m.sweclockers.com

Permalänk
Medlem

map ger dig en array, men max förväntar sig två eller flera variabler som argument. Vad ... gör är att den ger dig samtliga värden i en array som en serie variabler.

Visa signatur

AMD Ryzen 7 5800X | 32 GB Corsair Vengeance 3200 MHz | ASUS TUF Geforce RTX 3080

Permalänk
Medlem

Vad som händer med spread i det fallet är som att i ES5 skriva;

var x = [{ id: 1 },{ id: 10 },{ id: 30 },{ id: 5 }]; Math.max.apply(Math, x.map(function (x) { return x.id; }));

Permalänk
Datavetare

Värt att notera är att man får olika beteenden för en tom array. reduce() ger ett undantag medan "spread operator" ger negativ oändlighet.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer