首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >迭代对象属性并修改它们

迭代对象属性并修改它们
EN

Stack Overflow用户
提问于 2014-09-24 17:51:07
回答 4查看 69.8K关注 0票数 24

Underscore.js在集合上提供了_.each_.map,这很好,但我需要遍历对象的所有属性。我需要修改这些值并保留键。例如,我得到的代码类似于:{a:1, b:2, c:3},我需要执行一个操作来改变值,但保留密钥。比方说,我将计算平方,我应该得到{a:1, b:4, c:9}。问题是:如何使用下划线(对vanilla javascript不感兴趣)做到这一点?我喜欢这样的方法:

代码语言:javascript
复制
var a = {a:1, b:2, c:3}
_.magic(a, function(item){ return item*item; });

此外,如果可以链接它,那就太好了,因为我正在做一个map,转储结果来执行每个映射,然后再次使用map (因为我需要这样做)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-24 18:05:34

我更深入地查看了我的一些代码片段,看看是否有修改原始对象的选项,但我没有发现任何有趣的东西,所以我使用this :\

代码语言:javascript
复制
var original = {a:1, b:2, c:3};
var squaredValues = _.object(_.map(original, function (value, key) {
    return [key, value * value];
}));

不过,我希望有一个更优雅的解决方案。

票数 19
EN

Stack Overflow用户

发布于 2014-09-24 22:53:23

_.mapObject (added in version 1.8)就是您要找的东西。

对于以前的版本,可以使用_.each回调的第三个参数改变原始对象。

代码语言:javascript
复制
_.each({a:1, b:2, c:3}, function(value, key, obj) { obj[key] = value * value; });

使用带有初始备忘录的_.reduce也可以创建一个全新的对象。

代码语言:javascript
复制
_.reduce({a:1, b:2, c:3}, function(memo, value, key) {
    memo[key] = value * value;
    return memo;
}, {});

我更喜欢_.reduce方法。一个简单的混合将使它的行为完全像_.map

代码语言:javascript
复制
_.mixin({
    magic: function(obj, iterator, context) {
        return _.reduce(obj, function(memo, value, key) {
            memo[key] = iterator.call(context, value, key, obj);
            return memo;
        }, {});
    }
});
票数 39
EN

Stack Overflow用户

发布于 2016-09-11 17:17:47

正如贾斯汀所说,_.mapObject可能就是你要找的。但是这会创建一个新的对象(扩展{}),这可能不是你想要的(例如,如果它不是像new THREE.Vector3()这样的简单对象),在这里用不同的东西替换原始对象是不好的。

对于这种情况(修改给定对象中的值),只需将_.each与您的迭代器函数的第三个参数一起使用:

代码语言:javascript
复制
_.each(complexObject, function(value, key, obj) {
  obj[key] = value * value;
}); 
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26013802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档