1
1
'use strict' ;
2
2
var $ = require ( '../internals/export' ) ;
3
- var from = require ( '../internals/array-from' ) ;
3
+ var bind = require ( '../internals/function-bind-context' ) ;
4
+ var call = require ( '../internals/function-call' ) ;
5
+ var toObject = require ( '../internals/to-object' ) ;
6
+ var callWithSafeIterationClosing = require ( '../internals/call-with-safe-iteration-closing' ) ;
7
+ var isArrayIteratorMethod = require ( '../internals/is-array-iterator-method' ) ;
8
+ var isConstructor = require ( '../internals/is-constructor' ) ;
9
+ var lengthOfArrayLike = require ( '../internals/length-of-array-like' ) ;
10
+ var createProperty = require ( '../internals/create-property' ) ;
11
+ var getIterator = require ( '../internals/get-iterator' ) ;
12
+ var getIteratorMethod = require ( '../internals/get-iterator-method' ) ;
4
13
var checkCorrectnessOfIteration = require ( '../internals/check-correctness-of-iteration' ) ;
5
14
15
+ var $Array = Array ;
16
+
6
17
var INCORRECT_ITERATION = ! checkCorrectnessOfIteration ( function ( iterable ) {
7
18
// eslint-disable-next-line es/no-array-from -- required for testing
8
19
Array . from ( iterable ) ;
@@ -11,5 +22,34 @@ var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {
11
22
// `Array.from` method
12
23
// https://tc39.es/ecma262/#sec-array.from
13
24
$ ( { target : 'Array' , stat : true , forced : INCORRECT_ITERATION } , {
14
- from : from ,
25
+ from : function from ( arrayLike /* , mapfn = undefined, thisArg = undefined */ ) {
26
+ var O = toObject ( arrayLike ) ;
27
+ var IS_CONSTRUCTOR = isConstructor ( this ) ;
28
+ var argumentsLength = arguments . length ;
29
+ var mapfn = argumentsLength > 1 ? arguments [ 1 ] : undefined ;
30
+ var mapping = mapfn !== undefined ;
31
+ if ( mapping ) mapfn = bind ( mapfn , argumentsLength > 2 ? arguments [ 2 ] : undefined ) ;
32
+ var iteratorMethod = getIteratorMethod ( O ) ;
33
+ var index = 0 ;
34
+ var length , result , step , iterator , next , value ;
35
+ // if the target is not iterable or it's an array with the default iterator - use a simple case
36
+ if ( iteratorMethod && ! ( this === $Array && isArrayIteratorMethod ( iteratorMethod ) ) ) {
37
+ iterator = getIterator ( O , iteratorMethod ) ;
38
+ next = iterator . next ;
39
+ result = IS_CONSTRUCTOR ? new this ( ) : [ ] ;
40
+ for ( ; ! ( step = call ( next , iterator ) ) . done ; index ++ ) {
41
+ value = mapping ? callWithSafeIterationClosing ( iterator , mapfn , [ step . value , index ] , true ) : step . value ;
42
+ createProperty ( result , index , value ) ;
43
+ }
44
+ } else {
45
+ length = lengthOfArrayLike ( O ) ;
46
+ result = IS_CONSTRUCTOR ? new this ( length ) : $Array ( length ) ;
47
+ for ( ; length > index ; index ++ ) {
48
+ value = mapping ? mapfn ( O [ index ] , index ) : O [ index ] ;
49
+ createProperty ( result , index , value ) ;
50
+ }
51
+ }
52
+ result . length = index ;
53
+ return result ;
54
+ } ,
15
55
} ) ;
0 commit comments