Underscore.js对对象而不是数组执行操作

时间:2013-05-01 17:37:53

标签: underscore.js javascript

嘿,我是underscore.js的新手,我正在试图找出如何在地图上执行操作。我通读了API,恐怕我错过了什么。

这是我想做的事情:

doubled = _.someFunction( { bob: 25, sally: 30, tom: 5 }
                          , function(value){ return value*2; } 
                        );

返回:

{ bob: 50, sally: 60, tom: 10 }

知道怎么做吗?我应该使用_.mixin()创建新功能吗?

3 个答案:

答案 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; 
                }
        , {} )
};