我有以下代码来获取给定对象的密钥。所以对于对象
{"hello": {"data": {"a": "world", "b": "random"}}}
,如果传入的密钥是hello.data.a
,则输出将是world
。(object, key) => {
const keyParts = key.split(".");
let returnValue = object;
keyParts.forEach((part) => {
if (returnValue) {
returnValue = returnValue[part];
}
});
return returnValue;
}
我正在尝试找出如何以相同的方式动态地删除属性。例如,对于同一对象和键,它将使对象变异为{"hello": {"data": {"b": "random"}}}
。
基本上我想要与delete object.hello.data.a
相同的行为。但问题是hello.data.a
部分是通过动态字符串传递的。当然,像delete object[key]
这样的东西是行不通的,因为键有嵌套级别。如果只有1个深度级别,它将起作用,但对于嵌套项目将不起作用。
另一个重要说明是,在这种情况下性能非常重要。因此,尽管创建一个新对象并复制所有属性(除了要删除的属性)可能可行,但我非常担心其对性能产生的影响,与delete
关键字相比。
由于其他外部因素,我也不想将属性值设置为null
或undefined
。我希望将键实际从对象中删除。
我该如何实现这一点?
{ foo: 'foo' }
无法在不使用delete
的情况下删除foo
属性。 - CertainPerformancekey
变量中是否存在“.”,然后通过执行delete object[key]
来正常删除它。 - Charlie FishnextLastObj
是一个引用而不是值的副本,删除它会起作用?如果您可以进一步阐述一下您的答案,那么我和其他人就可以更好地理解为什么会这样工作以及其中涉及的基本概念。非常感谢您的帮助! - Charlie Fishdelete
。仅使用最后一个键无法替换最后一个对象(出于同样的原因,{ foo: 'foo' }
加上'foo'
也行不通),但是通过使用倒数第二个键,您可以在其父级上替换最后一个对象。通过保存倒数第二个键,您可以重新分配给父对象。 - CertainPerformance