0

嘿,我是underscore.js的新手,我正在尝试弄清楚如何在地图上执行操作。我通读了 API,恐怕我遗漏了一些东西。

这是我想做的:

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

返回:

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

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

4

3 回答 3

2

你可以做一个这样的双重功能:

function double(data) {

  var doubled = {};

  _.each(data, function(value, key) {
    doubled[key] = 2 * value;
  });

  return doubled;

};

double({ bob: 25, sally: 30, tom: 5 });
于 2013-05-01T17:43:28.587 回答
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; 
                }
        , {} )
};
于 2013-05-02T00:41:39.093 回答
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; })
);
于 2013-05-01T18:46:19.663 回答