【问题标题】:Modify object's keys without creating new object [duplicate]修改对象的键而不创建新对象[重复]
【发布时间】:2014-11-13 18:45:48
【问题描述】:

我有以下输入:

{
  foo: 4,
  bar: 3
}

我想修改这个对象的键来获取:

{
  x_foo_y: 4,
  x_bar_y: 3
}

是否可以在不创建新对象的情况下修改对象? (jQuery 可用)

【问题讨论】:

    标签: javascript jquery object


    【解决方案1】:

    是的,您只需添加新密钥并删除旧密钥:

    obj.x_foo_y = obj.foo;
    delete obj.foo;
    obj.x_bar_y = obj.bar;
    delete obj.bar;
    

    请注意,在某些引擎上(尤其是 Chrome 中的 V8),这将 impact the performance 的对象。如果您实际上不需要删除属性,您可以将它们的值设置为undefined

    obj.x_foo_y = obj.foo;
    obj.foo = undefined;
    obj.x_bar_y = obj.bar;
    obj.bar = undefined;
    

    不会产生影响(正是delete 使 V8 将对象置于“字典模式”,这比 V8 的正常编译类模式慢得多)。

    如果您想对对象中的所有“自有”属性执行此操作:

    var key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) {
            obj["x" + key + "y"] = obj[key];
            delete obj[key]; // Or obj[key] = undefined if that's okay for your use case
        }
    }
    

    【讨论】:

    • add-property-after-literal 不会触发“字典模式”?
    • 是否可以循环执行?因为所有的键都将获得相同的前缀/后缀。
    • 这是一个很棒的见解。
    • @user2864740:不,V8 的 JIT 创建了一个带有附加属性的派生类。
    • @Scimonster:对。这就是为什么我说“如果你不需要实际删除属性......”“......如果这对你的用例没问题......”我>
    【解决方案2】:

    您需要添加密钥,然后删除旧密钥。

    var obj = {
      foo: 4,
      bar: 3
    };
    obj.x_foo_y = obj.foo;
    obj.x_bar_y = obj.bar;
    delete obj.foo;
    delete obj.bar;
    alert(JSON.stringify(obj))

    【讨论】:

    • 哦!代码sn-p!我没有意识到他们已经上线了。 :-)
    猜你喜欢
    • 2014-08-03
    • 2017-02-25
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2013-07-06
    • 1970-01-01
    相关资源
    最近更新 更多