嘿,我是underscore.js的新手,我正在试图找出如何在地图上执行操作。我通读了API,恐怕我错过了什么。
这是我想做的事情:
doubled = _.someFunction( { bob: 25, sally: 30, tom: 5 }
, function(value){ return value*2; }
);
返回:
{ bob: 50, sally: 60, tom: 10 }
知道怎么做吗?我应该使用_.mixin()
创建新功能吗?
答案 0 :(得分:2)
你可以做这样的双重功能:
function double(data) {
var doubled = {};
_.each(data, function(value, key) {
doubled[key] = 2 * value;
});
return doubled;
};
double({ bob: 25, sally: 30, tom: 5 });
答案 1 :(得分:1)
不,Underscore确实没有为对象提供map
函数。 (您可以在对象上使用_.map
,但它将返回一个数组)
所以,你必须手动完成:
_.someFunction = function(o, f) {
var res = {};
for (var p in o)
res[p] = f(o[p]);
return res;
};
当然你可以使用下划线的一些迭代函数。如果没有帮助函数,这些片段可能或多或少具有表现力:
var doubled = {};
_.each({ bob: 25, sally: 30, tom: 5 }, function(p, value){
doubled[p] = value*2;
});
var doubled = _.reduce({ bob: 25, sally: 30, tom: 5 }, function(m, value, p){
m[p] = value*2;
return m;
}, {});
var obj = { bob: 25, sally: 30, tom: 5 };
var doubled = _.object(
_.keys(obj),
_.map(_.values(obj), function(value){ return value*2; })
);
答案 2 :(得分:1)
对于那些感兴趣的人,这是我最终做的事情:(见reduce function API)
_.mapValues = function( object, iterator, context ){
if (context) iterator = _.bind(iterator, context);
return _.reduce(
object
, function( memo, value, key ){
memo[key] = iterator( value, key );
return memo;
}
, {} )
};