相关源码如下:
_.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;
};
// Return the results of applying the iteratee to each element.
_.map = _.collect = function(obj, iteratee, context) {
iteratee = cb(iteratee, context);
var keys = !isArrayLike(obj) && _.keys(obj),
length = (keys || obj).length,
results = Array(length);
for (var index = 0; index < length; index++) {
var currentKey = keys ? keys[index] : index;
results[index] = iteratee(obj[currentKey], currentKey, obj);
}
return results;
};
两个函数体中第一行分别为
iteratee = optimizeCb(iteratee, context);
和
iteratee = cb(iteratee, context);
这里是有什么用意么,小的想了很久~感觉要是我的话会统一用
iteratee = optimizeCb(iteratee, context);
不晓得为何要用不一样的写法。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
核心原因就是map要返回一个新数组, 所以针对这一点要做更多的判断, 比如缺省iteratee, iteratee如果是个object怎么办, 是个数组怎么办... 如果overwrite了内置的_.iteratee怎么办..等等
正常来说, 如果iteratee是个function, 而且_.iteratee没有被覆盖的话, 和使用 optimizeCb是一样的.
和jq差不多的吧,each只是遍历,map通过遍历返回一个新的值