下划线_.each和_.map之间的真正区别是什么
What is really the difference between underscore _.each and _.map?
我正在使用UndercoreJs。考虑这个代码:
var docs = [
{name : 'Anders', niche : 'Web Development'},
{name : 'Johnny', niche : 'Design'},
{name : 'Eric', niche : 'PhotoShop'}
];
var newDocs = _.map(docs, function (doc){
delete doc.niche;
return doc;
});
我在这里使用.each
还是.map
并不重要。结果完全一样。
在上述情况下,两者之间的真正区别是什么?
map
旨在成为一个函数映射方法:它的函数参数应该返回一个值,但预计不会有任何副作用。
each
只是命令式for
循环的函数替换:它的目的是产生效果,并且它不应该返回任何值。
例如,这将是map
:更合适的用途
var docs = getDocs();
var docTitles = _.map(docs, function (doc){
return doc.title;
});
// expect `docs` to be unchanged
而这将是each
:的适当用途
var docs = getDocs();
_.each(docs, function (doc){
delete doc.niche;
});
// expect `docs` to be altered.
_.each(list,iteratee)
对元素列表进行迭代,依次生成一个迭代函数。
每次调用iteratee都使用三个参数:(element、index、list)。如果list是一个JavaScript对象,iteratee的参数将是(value、key、list)。返回用于链接的列表
_.each({one: 1, two: 2, three: 3}, alert);
=> alerts each number value in turn...
_.map(列表,iteratee)
通过转换函数(iteratee)映射列表中的每个值,生成一个新的值数组。
如果list是一个JavaScript对象,iteratee的参数将是(value,key,list)
_.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; });
=> [3, 6, 9]
请参阅文档
您关于结果"完全相同"的断言是不真实的。_.each()
函数返回原始列表,但_.map()
返回新名单。您在执行过程中直接修改原始对象,因此最终会在每个列表中引用相同的对象,但使用_.map()
,最终会得到两个独立的数组实例。
您只需查看源代码即可看出区别:
-
_.each
:_.each = _.forEach = function(obj, iteratee, context) { if (obj == null) return obj; iteratee = createCallback(iteratee, context); var i, length = obj.length; if (length === +length) { for (i = 0; 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; };
-
_.map
:_.map = _.collect = function(obj, iteratee, context) { if (obj == null) return []; iteratee = _.iteratee(iteratee, context); var keys = obj.length !== +obj.length && _.keys(obj), length = (keys || obj).length, results = Array(length), currentKey; for (var index = 0; index < length; index++) { currentKey = keys ? keys[index] : index; results[index] = iteratee(obj[currentKey], currentKey, obj); } return results; };
相关文章:
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 全局变量和全局对象的属性之间有什么区别吗
- 打破承诺链的好方法是什么
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Javascript中的空白是什么
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 在ember/handlers中使用value和valueBinding有什么区别
- 在JavaScript中拆分日期字符串的更好方法是什么
- Javascript .call() 用法.一个工作案例,一个不是.有什么区别
- 咖啡脚本中的“if a 不是未定义的”和“if a”有什么区别
- fs.link和fs.symlink之间有什么区别?他们是独立于平台的吗
- 都是'sync'event和Backbone.sync以某种方式连接在一起——两者之间有什么区别
- 这真的是异步的吗?或者它发生得太快了,没有什么区别
- emu -model、emu -restless和emu之间的主要区别(优缺点)是什么?
- 良性和恶意的javascript(都是混淆的)有什么区别?
- function()在jQuery中是什么意思?这个和$(这个)有什么区别
- 什么是数组,数组和对象有什么区别,以及何时以及为什么使用数组
- 这种比较和逻辑上的“比较”有什么区别;而不是“;操作人员
- 使用""有什么区别吗?或者不是javascript对象中的属性