Javascript 下划线u0.each和0.map之间的真正区别是什么?
我用的是下划线。考虑这个代码:Javascript 下划线u0.each和0.map之间的真正区别是什么?,javascript,node.js,Javascript,Node.js,我用的是下划线。考虑这个代码: 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; });
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
都无所谓。结果完全一样
在上面的例子中,两者之间的真正区别是什么?\每个(列表,迭代对象)
迭代元素列表,依次生成一个iteratee函数
每次调用iteratee都使用三个参数进行调用:(元素、索引、列表)。若列表是一个JavaScript对象,迭代对象的参数将是(值、键、列表)。返回用于链接的列表
_.map(列表,迭代对象)
通过转换函数(iteratee)映射列表中的每个值,生成一个新的值数组
若列表是一个JavaScript对象,迭代对象的参数将是(值、键、列表)
请参见
映射
是一种函数映射方法:其函数参数应返回一个值,但预计不会产生任何副作用
每个
都只是循环的命令式的功能替代品:其目的是产生效果,并且不希望返回任何值
例如,这将是对map
更合适的用法:
var docs = getDocs();
var docTitles = _.map(docs, function (doc){
return doc.title;
});
// expect `docs` to be unchanged
而这将是对每个
的适当使用:
var docs = getDocs();
_.each(docs, function (doc){
delete doc.niche;
});
// expect `docs` to be altered.
你声称结果“完全相同”是不真实的。函数返回原始列表,但返回新列表。您在执行时直接修改原始对象,因此每个列表中都会引用相同的对象,但如果使用
.map()
,则会得到两个单独的数组实例。您只需查看源代码即可看出区别:
- :
.each()
迭代,.map()
项目,即使用指定的函数构建新元素,从作为输入传递的数组构建一个新数组。一个迭代,一个收集?你有一个病态的例子,你运行它的副作用。我向上投票来平衡向下投票,我认为这是一个很好的问题,谁不同意地图功能。只要看看回复的数量。。。以及其中两个的卓越品质。
var docs = getDocs();
var docTitles = _.map(docs, function (doc){
return doc.title;
});
// expect `docs` to be unchanged
var docs = getDocs();
_.each(docs, function (doc){
delete doc.niche;
});
// expect `docs` to be altered.
_.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 = _.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;
};