_.each
_.each(list, iteratee, [context]) 别名: forEach
遍历list中的所有元素,按顺序用遍历输出每个元素。
如果传递了context参数,则把iteratee绑定到context对象上。
每次调用iteratee都会传递三个参数:(element, index, list)。
如果list是个JavaScript对象,iteratee的参数是 (value, key, list))。返回list以方便链式调用。
(注:如果存在原生的forEach方法,Underscore就使用它代替。)
测试代码
_ = require('underscore');
var a = [1, 2, 3];
function test(element, index, list) {
if(list[index] == 2) {
console.log(element);
console.log(index);
console.log(list);
};
};
_.each(a,test(element, index, list));
源码
_.each = _.forEach = function(obj, iteratee, context) {
iteratee = optimizeCb(iteratee, context);
var i, length;
if (isArrayLike(obj)) {
for (i = 0, length = obj.length; i < length; i++) {
iteratee(obj[i], i, obj);
}
} else {
var keys = _.keys(obj);
for (i = 0, length = keys.length; i < length; i++) {
iteratee(obj[keys[i]], keys[i], obj);
}
}
return obj;
};
var optimizeCb = function(func, context, argCount) {
if (context === void 0) return func;
switch (argCount) {
case 1: return function(value) {
return func.call(context, value);
};
case null:
case 3: return function(value, index, collection) {
return func.call(context, value, index, collection);
};
case 4: return function(accumulator, value, index, collection) {
return func.call(context, accumulator, value, index, collection);
};
}
return function() {
return func.apply(context, arguments);
};
};
_.iteratee
_.iteratee(value, [context])
一个重要的内部函数用来生成可应用到集合中每个元素的回调, 返回想要的结果 - 无论是等式,任意回调,属性匹配,或属性访问。
测试代码
var stooges = [{name: 'curly', age: 25}, {name: 'moe', age: 21}, {name: 'larry', age: 23}];
_.map(stooges, _.iteratee('age'));
=> [25, 21, 23];
源码
_.iteratee = builtinIteratee = function(value, context) {
return cb(value, context, Infinity);
};
var cb = function(value, context, argCount) {
if (_.iteratee !== builtinIteratee) return _.iteratee(value, context);
if (value == null) return _.identity;
if (_.isFunction(value)) return optimizeCb(value, context, argCount);
if (_.isObject(value) && !_.isArray(value)) return _.matcher(value);
return _.property(value);
};