Array.From
In the past we used a variety of hacks to convert Array-like objects (like arguments
and NodeList
) to a true array. You can see a few of those hacks here:
Essentially we would use Array.prototype.slice.call()
on the arguments
or NodeList
to do the conversion. These days there is a more straightforward solution to converting one type to another.
Convert NodeList
to Array
var divs = Array.from(document.querySelectorAll('div')); // Array[232] (every DIV on the page)
Convert arguments
to Array
function something() { var args = Array.from(arguments); // Array['yes', 1, {}] } something('yes', 1, {});
Convert String
to Array
Array.from('JavaScript'); // Same as 'JavaScript'.split('') // ["J", "a", "v", "a", "S", "c", "r", "i", "p", "t"]
The code is much cleaner and no need for the slice
hack!
small note -> babel doesn’t transpile
Array.from()
– so keep that in mind to include it ;)[].slice.call(stuff)
isn’t much longer thanArray.from(stuff)
Array.apply(0, stuff)
is also a good solutionIt’s not about which one is shorter,
Array.from
is just more declarative approach to doing the same thing.There’s a babel plug-in for
Array.from()
https://babeljs.io/docs/usage/polyfill/
When using ES6, you can use the spread operator with array-like objects like this :
You can even use this with Sets, a cool trick to make an array unique :
Instead of spread you could use rest operator:
Is the section “Convert String to Array” definitely correct?
When I check the console I see the below:
That’s actually a bit funny. If you run that code in dev tools opened from this article, the
Array.from
function is overwritten by MooTools, and no longer works like the “native” version.Run it in a new browser window and it should work.
Paul, did the same thing for me, but if I run the code somewhere else (tried it on repl.it) it works just as it’s supposed to.
What he said…old MooTools has it wrong. I’ll be removing MooTools and all frameworks from the site soon.
I built a site in reactjs with es6 recently. Standard stack (these days).
The damn thing wouldn’t work on old Android browsers and certain browser in WebPageTest. “TypeError: function is undefined” (or something like that).
Turns out these old browsers choked on the first occurrence of
Array.from()
.Adding babel-polyfill made my day.
What about performance, which one is the best approach??
Looks like
is the fastest option (in Chrome and Firefox).
and
are second or third depending (different results in Chrome and FF), and unfortunately
is the slowest by far on both browsers… :(