duc*_*cin 21 javascript underscore.js
Underscore.js提供_.each和_.map上集合,这是很好的,但我需要遍历我对象的所有属性.我需要修改值并保留键.例如,我有类似的东西:{a:1, b:2, c:3}我需要执行一个更改值但保留键的操作.让我们说,我会计算正方形,我应该得到{a:1, b:4, c:9}.问题是:如何使用下划线(对vanilla javascript不感兴趣)?我喜欢这样的方法:
var a = {a:1, b:2, c:3}
_.magic(a, function(item){ return item*item; });
Run Code Online (Sandbox Code Playgroud)
另外,如果可以链接它,那将是很好的,因为我正在做一个地图,转储结果来执行每个,然后再次使用地图(因为我需要).
Jus*_*tin 37
_.mapObject(在1.8版中添加)正是您正在寻找的.
对于以前的版本,可以使用_.each回调的第三个参数来改变原始对象.
_.each({a:1, b:2, c:3}, function(value, key, obj) { obj[key] = value * value; });
Run Code Online (Sandbox Code Playgroud)
使用_.reduce初始备忘录也可以创建一个全新的对象.
_.reduce({a:1, b:2, c:3}, function(memo, value, key) {
memo[key] = value * value;
return memo;
}, {});
Run Code Online (Sandbox Code Playgroud)
我更喜欢这种_.reduce方法.一个简单的mixin会使它表现得像_.map.
_.mixin({
magic: function(obj, iterator, context) {
return _.reduce(obj, function(memo, value, key) {
memo[key] = iterator.call(context, value, key, obj);
return memo;
}, {});
}
});
Run Code Online (Sandbox Code Playgroud)
小智 18
我看了一些我的片段,看看是否有一个选项可以改变原始对象,但我没有找到任何有趣的内容,所以我会选择这个:
var original = {a:1, b:2, c:3};
var squaredValues = _.object(_.map(original, function (value, key) {
return [key, value * value];
}));
Run Code Online (Sandbox Code Playgroud)
我希望有一个更优雅的解决方案.
正如贾斯汀所说_.mapObject 可能是你正在寻找的。但这会创建一个新对象(扩展{}),它可能不是您想要的(例如,如果它不是像 那样的简单对象new THREE.Vector3()),在这里用不同的东西替换原始对象是不好的。
对于这种情况(在就地修改值在给定对象),只要用_.each与iteratee功能的第三个参数:
_.each(complexObject, function(value, key, obj) {
obj[key] = value * value;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66136 次 |
| 最近记录: |