繁体   English   中英

为什么在这两种情况下,underscore.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 ,然后是迭代的valueindex (或key ),最后是对整个list的引用。

因此,您最终会这样调用extend (在第一遍):

underscore.extend({}, {x: 1}, 'a', obj)

然后第二遍

underscore.extend({/*...stuff...*/}, {y: 2}, 'b', obj)

对象具有'0': 'b'属性的原因是字符串延伸到包含'<index>': '<char>''<index>': '<char>'属性的对象中。 这是因为_.extend在每个参数(第一个参数除外)上运行for...in...循环,并且通过此操作找到的键是字符索引(从0str.length - 1 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM