You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					66 lines
				
				2.5 KiB
			
		
		
			
		
	
	
					66 lines
				
				2.5 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								var bind = require('../internals/function-bind-context');
							 | 
						||
| 
								 | 
							
								var IndexedObject = require('../internals/indexed-object');
							 | 
						||
| 
								 | 
							
								var toObject = require('../internals/to-object');
							 | 
						||
| 
								 | 
							
								var toLength = require('../internals/to-length');
							 | 
						||
| 
								 | 
							
								var arraySpeciesCreate = require('../internals/array-species-create');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var push = [].push;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation
							 | 
						||
| 
								 | 
							
								var createMethod = function (TYPE) {
							 | 
						||
| 
								 | 
							
								  var IS_MAP = TYPE == 1;
							 | 
						||
| 
								 | 
							
								  var IS_FILTER = TYPE == 2;
							 | 
						||
| 
								 | 
							
								  var IS_SOME = TYPE == 3;
							 | 
						||
| 
								 | 
							
								  var IS_EVERY = TYPE == 4;
							 | 
						||
| 
								 | 
							
								  var IS_FIND_INDEX = TYPE == 6;
							 | 
						||
| 
								 | 
							
								  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
							 | 
						||
| 
								 | 
							
								  return function ($this, callbackfn, that, specificCreate) {
							 | 
						||
| 
								 | 
							
								    var O = toObject($this);
							 | 
						||
| 
								 | 
							
								    var self = IndexedObject(O);
							 | 
						||
| 
								 | 
							
								    var boundFunction = bind(callbackfn, that, 3);
							 | 
						||
| 
								 | 
							
								    var length = toLength(self.length);
							 | 
						||
| 
								 | 
							
								    var index = 0;
							 | 
						||
| 
								 | 
							
								    var create = specificCreate || arraySpeciesCreate;
							 | 
						||
| 
								 | 
							
								    var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
							 | 
						||
| 
								 | 
							
								    var value, result;
							 | 
						||
| 
								 | 
							
								    for (;length > index; index++) if (NO_HOLES || index in self) {
							 | 
						||
| 
								 | 
							
								      value = self[index];
							 | 
						||
| 
								 | 
							
								      result = boundFunction(value, index, O);
							 | 
						||
| 
								 | 
							
								      if (TYPE) {
							 | 
						||
| 
								 | 
							
								        if (IS_MAP) target[index] = result; // map
							 | 
						||
| 
								 | 
							
								        else if (result) switch (TYPE) {
							 | 
						||
| 
								 | 
							
								          case 3: return true;              // some
							 | 
						||
| 
								 | 
							
								          case 5: return value;             // find
							 | 
						||
| 
								 | 
							
								          case 6: return index;             // findIndex
							 | 
						||
| 
								 | 
							
								          case 2: push.call(target, value); // filter
							 | 
						||
| 
								 | 
							
								        } else if (IS_EVERY) return false;  // every
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = {
							 | 
						||
| 
								 | 
							
								  // `Array.prototype.forEach` method
							 | 
						||
| 
								 | 
							
								  // https://tc39.github.io/ecma262/#sec-array.prototype.foreach
							 | 
						||
| 
								 | 
							
								  forEach: createMethod(0),
							 | 
						||
| 
								 | 
							
								  // `Array.prototype.map` method
							 | 
						||
| 
								 | 
							
								  // https://tc39.github.io/ecma262/#sec-array.prototype.map
							 | 
						||
| 
								 | 
							
								  map: createMethod(1),
							 | 
						||
| 
								 | 
							
								  // `Array.prototype.filter` method
							 | 
						||
| 
								 | 
							
								  // https://tc39.github.io/ecma262/#sec-array.prototype.filter
							 | 
						||
| 
								 | 
							
								  filter: createMethod(2),
							 | 
						||
| 
								 | 
							
								  // `Array.prototype.some` method
							 | 
						||
| 
								 | 
							
								  // https://tc39.github.io/ecma262/#sec-array.prototype.some
							 | 
						||
| 
								 | 
							
								  some: createMethod(3),
							 | 
						||
| 
								 | 
							
								  // `Array.prototype.every` method
							 | 
						||
| 
								 | 
							
								  // https://tc39.github.io/ecma262/#sec-array.prototype.every
							 | 
						||
| 
								 | 
							
								  every: createMethod(4),
							 | 
						||
| 
								 | 
							
								  // `Array.prototype.find` method
							 | 
						||
| 
								 | 
							
								  // https://tc39.github.io/ecma262/#sec-array.prototype.find
							 | 
						||
| 
								 | 
							
								  find: createMethod(5),
							 | 
						||
| 
								 | 
							
								  // `Array.prototype.findIndex` method
							 | 
						||
| 
								 | 
							
								  // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex
							 | 
						||
| 
								 | 
							
								  findIndex: createMethod(6)
							 | 
						||
| 
								 | 
							
								};
							 |