Skip to content

Commit

Permalink
Polyfill Array.from
Browse files Browse the repository at this point in the history
Reviewed By: cpojer

Differential Revision: D2627437

fb-gh-sync-id: 6a7c94e13db772d96cbd8ebab37eccb0826963bc
  • Loading branch information
josephsavona authored and facebook-github-bot-0 committed Nov 6, 2015
1 parent 853d249 commit c473974
Showing 1 changed file with 74 additions and 0 deletions.
Expand Up @@ -55,4 +55,78 @@
}
});
}

/**
* Creates an array from array like objects.
*
* https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from
*/
if (!Array.from) {
Array.from = function(arrayLike /*, mapFn, thisArg */) {
if (arrayLike == null) {
throw new TypeError('Object is null or undefined');
}

// Optional args.
var mapFn = arguments[1];
var thisArg = arguments[2];

var C = this;
var items = Object(arrayLike);
var symbolIterator = typeof Symbol === 'function'
? Symbol.iterator
: '@@iterator';
var mapping = typeof mapFn === 'function';
var usingIterator = typeof items[symbolIterator] === 'function';
var key = 0;
var ret;
var value;

if (usingIterator) {
ret = typeof C === 'function'
? new C()
: [];
var it = items[symbolIterator]();
var next;

while (!(next = it.next()).done) {
value = next.value;

if (mapping) {
value = mapFn.call(thisArg, value, key);
}

ret[key] = value;
key += 1;
}

ret.length = key;
return ret;
}

var len = items.length;
if (isNaN(len) || len < 0) {
len = 0;
}

ret = typeof C === 'function'
? new C(len)
: new Array(len);

while (key < len) {
value = items[key];

if (mapping) {
value = mapFn.call(thisArg, value, key);
}

ret[key] = value;

key += 1;
}

ret.length = key;
return ret;
};
}
})();

0 comments on commit c473974

Please sign in to comment.