2013-05-01 35 views
0

嗨,我是underscore.js的新手,我试图弄清楚如何在地图上执行操作。我通读了API,恐怕我错过了一些东西。Underscore.js在对象上执行操作,而不是数组

这是我想做什么:

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

返回:

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

任何想法如何做到这一点?我应该用_.mixin()创建一个新功能吗?

回答

1

没有,下划线确实没有为对象提供一个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; }) 
); 
+0

这就是我需要的。看看我去了下面。 – redolent 2013-05-02 00:40:15

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

如果我设置了'_.double = double'就可以了。 – redolent 2013-05-01 18:49:27

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; 
       } 
     , {}) 
}; 
+0

'上下文'?它不应该是'func.call(context,value,key)'吗? – Bergi 2013-05-02 00:45:24

+0

EDITED。我不得不为他们争取他们的来源。我复制了他们使用的代码行。 – redolent 2013-05-02 04:53:26

相关问题