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;
|
||
|
};
|
||
|
};
|