修改对象的键而不创建新对象[重复]
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!我没有意识到他们已经上线了。 :-)以上是关于修改对象的键而不创建新对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章