1'use strict'; 2// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray 3var isArray = require('./_is-array'); 4var isObject = require('./_is-object'); 5var toLength = require('./_to-length'); 6var ctx = require('./_ctx'); 7var IS_CONCAT_SPREADABLE = require('./_wks')('isConcatSpreadable'); 8 9function flattenIntoArray(target, original, source, sourceLen, start, depth, mapper, thisArg) { 10 var targetIndex = start; 11 var sourceIndex = 0; 12 var mapFn = mapper ? ctx(mapper, thisArg, 3) : false; 13 var element, spreadable; 14 15 while (sourceIndex < sourceLen) { 16 if (sourceIndex in source) { 17 element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex]; 18 19 spreadable = false; 20 if (isObject(element)) { 21 spreadable = element[IS_CONCAT_SPREADABLE]; 22 spreadable = spreadable !== undefined ? !!spreadable : isArray(element); 23 } 24 25 if (spreadable && depth > 0) { 26 targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1; 27 } else { 28 if (targetIndex >= 0x1fffffffffffff) throw TypeError(); 29 target[targetIndex] = element; 30 } 31 32 targetIndex++; 33 } 34 sourceIndex++; 35 } 36 return targetIndex; 37} 38 39module.exports = flattenIntoArray; 40