修改对象的键而不创建新对象[重复]

Posted

技术标签:

【中文标题】修改对象的键而不创建新对象[重复]【英文标题】: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 可用)

【问题讨论】:

【参考方案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!我没有意识到他们已经上线了。 :-)

以上是关于修改对象的键而不创建新对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

打印 NSDictionary 的键而不是值

StringBuilder

StringBuilder

获取主键而不插入空行

C# String与StringBuilder

java stringBuilder的用法