为什么下划线.在这两种情况下,Reduce的作用是不同的
Why does underscore.reduce acts differently in these two cases?
我试图将一个有两个对象的对象压平,所以我做了以下操作:
var underscore = require('underscore');
var obj = { a: {x:1}, b: {y:2}};
underscore.reduce(obj, underscore.extend, {});
没想到,我得到的输出是:
{
'0': 'b',
x: 1,
a: { x: 1 },
b: { y: 2 },
y: 2
}
所以我试着把extend
包装在一个函数中:
underscore.reduce(obj, function(memo, o) {
return underscore.extend(memo, o);
}, {});
并得到了预期的结果:
{ x: 1, y: 2 }
为什么有区别?reduce
期望作为第二个参数的函数获得两个参数并返回一个,并且它在两种情况下都得到它。那么我错过了什么呢?
reduce
期望作为第二个参数,一个函数获得两个参数并返回一个…
根据文档没有。下划线传递给迭代器四个参数,而不是两个:
因此,您最终会像这样调用传递给迭代器四个参数:
memo
,然后是迭代的value
和index
(或key
),最后是对整个list
的引用。
extend
(在第一次传递时):underscore.extend({}, {x: 1}, 'a', obj)
然后是第二次
underscore.extend({/*...stuff...*/}, {y: 2}, 'b', obj)
对象具有'0': 'b'
属性的原因是字符串扩展为包含'<index>': '<char>'
等属性的对象。这是因为_.extend
在每个参数上运行for...in...
循环(第一个参数除外),并且通过对字符串执行此操作找到的键是字符索引(从0
到str.length - 1
)。
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 监视函数从服务返回不起作用,但作用域函数起作用
- 幻灯片滚动javascript不起作用
- 简单的javascript在Shopify中不起作用
- Recaptcha在IE7和IE8中不起作用
- Ember Data DS.Model's set函数不起作用
- JsFiddle上的鼠标事件不起作用
- 将作用域存储在JSON中
- 我的AngularJS表达式没有'不起作用
- 点击按钮输入不起作用
- 面向对象的Javascript代码在IE7中不起作用
- 分部隐藏在jquery中不起作用
- 在phonegap应用程序内部重定向不起作用
- Array.length似乎不起作用;console.log则显示其他情况
- Javascript作用域规则和mongo-map/reduce函数
- 为什么这个map reduce Promises数组不起作用,而只是减少它起作用
- 使用reduce串行链接Javascript承诺时的作用域问题
- Javascript reduce函数在这个对象上不起作用
- 理解Array.reduce()和作用域
- 为什么下划线.在这两种情况下,Reduce的作用是不同的