123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- "use strict";
- var iteratorSymbol = require("es6-symbol").iterator
- , isArguments = require("../../function/is-arguments")
- , isFunction = require("../../function/is-function")
- , toPosInt = require("../../number/to-pos-integer")
- , callable = require("../../object/valid-callable")
- , validValue = require("../../object/valid-value")
- , isValue = require("../../object/is-value")
- , isString = require("../../string/is-string")
- , isArray = Array.isArray
- , call = Function.prototype.call
- , desc = { configurable: true, enumerable: true, writable: true, value: null }
- , defineProperty = Object.defineProperty;
- // eslint-disable-next-line complexity, max-lines-per-function
- module.exports = function (arrayLike/*, mapFn, thisArg*/) {
- var mapFn = arguments[1]
- , thisArg = arguments[2]
- , Context
- , i
- , j
- , arr
- , length
- , code
- , iterator
- , result
- , getIterator
- , value;
- arrayLike = Object(validValue(arrayLike));
- if (isValue(mapFn)) callable(mapFn);
- if (!this || this === Array || !isFunction(this)) {
- // Result: Plain array
- if (!mapFn) {
- if (isArguments(arrayLike)) {
- // Source: Arguments
- length = arrayLike.length;
- if (length !== 1) return Array.apply(null, arrayLike);
- arr = new Array(1);
- arr[0] = arrayLike[0];
- return arr;
- }
- if (isArray(arrayLike)) {
- // Source: Array
- arr = new Array((length = arrayLike.length));
- for (i = 0; i < length; ++i) arr[i] = arrayLike[i];
- return arr;
- }
- }
- arr = [];
- } else {
- // Result: Non plain array
- Context = this;
- }
- if (!isArray(arrayLike)) {
- if ((getIterator = arrayLike[iteratorSymbol]) !== undefined) {
- // Source: Iterator
- iterator = callable(getIterator).call(arrayLike);
- if (Context) arr = new Context();
- result = iterator.next();
- i = 0;
- while (!result.done) {
- value = mapFn ? call.call(mapFn, thisArg, result.value, i) : result.value;
- if (Context) {
- desc.value = value;
- defineProperty(arr, i, desc);
- } else {
- arr[i] = value;
- }
- result = iterator.next();
- ++i;
- }
- length = i;
- } else if (isString(arrayLike)) {
- // Source: String
- length = arrayLike.length;
- if (Context) arr = new Context();
- for (i = 0, j = 0; i < length; ++i) {
- value = arrayLike[i];
- if (i + 1 < length) {
- code = value.charCodeAt(0);
- // eslint-disable-next-line max-depth
- if (code >= 0xd800 && code <= 0xdbff) value += arrayLike[++i];
- }
- value = mapFn ? call.call(mapFn, thisArg, value, j) : value;
- if (Context) {
- desc.value = value;
- defineProperty(arr, j, desc);
- } else {
- arr[j] = value;
- }
- ++j;
- }
- length = j;
- }
- }
- if (length === undefined) {
- // Source: array or array-like
- length = toPosInt(arrayLike.length);
- if (Context) arr = new Context(length);
- for (i = 0; i < length; ++i) {
- value = mapFn ? call.call(mapFn, thisArg, arrayLike[i], i) : arrayLike[i];
- if (Context) {
- desc.value = value;
- defineProperty(arr, i, desc);
- } else {
- arr[i] = value;
- }
- }
- }
- if (Context) {
- desc.value = null;
- arr.length = length;
- }
- return arr;
- };
|