45 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// 0 -> Array#forEach
 | 
						|
// 1 -> Array#map
 | 
						|
// 2 -> Array#filter
 | 
						|
// 3 -> Array#some
 | 
						|
// 4 -> Array#every
 | 
						|
// 5 -> Array#find
 | 
						|
// 6 -> Array#findIndex
 | 
						|
var ctx = require('./_ctx');
 | 
						|
var IObject = require('./_iobject');
 | 
						|
var toObject = require('./_to-object');
 | 
						|
var toLength = require('./_to-length');
 | 
						|
var asc = require('./_array-species-create');
 | 
						|
module.exports = function (TYPE, $create) {
 | 
						|
  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;
 | 
						|
  var create = $create || asc;
 | 
						|
  return function ($this, callbackfn, that) {
 | 
						|
    var O = toObject($this);
 | 
						|
    var self = IObject(O);
 | 
						|
    var f = ctx(callbackfn, that, 3);
 | 
						|
    var length = toLength(self.length);
 | 
						|
    var index = 0;
 | 
						|
    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
 | 
						|
    var val, res;
 | 
						|
    for (;length > index; index++) if (NO_HOLES || index in self) {
 | 
						|
      val = self[index];
 | 
						|
      res = f(val, index, O);
 | 
						|
      if (TYPE) {
 | 
						|
        if (IS_MAP) result[index] = res;   // map
 | 
						|
        else if (res) switch (TYPE) {
 | 
						|
          case 3: return true;             // some
 | 
						|
          case 5: return val;              // find
 | 
						|
          case 6: return index;            // findIndex
 | 
						|
          case 2: result.push(val);        // filter
 | 
						|
        } else if (IS_EVERY) return false; // every
 | 
						|
      }
 | 
						|
    }
 | 
						|
    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
 | 
						|
  };
 | 
						|
};
 |