我正在尝试创建一些树形结构.
我想访问我的数据如下:
data[key1][key2]
Run Code Online (Sandbox Code Playgroud)
但是,key1和key2具有对称关系; 以下是永远的:
data[key1][key2] == data[key2][key1]
Run Code Online (Sandbox Code Playgroud)
更具体地说,我有data[key1][key2]并data[key2][key1]指向同一个对象,因此对一个对象的更改会影响另一个对象.
我的问题出现了,因为我希望删除底层对象.我知道我是否使用:
delete data[key1][key2];
Run Code Online (Sandbox Code Playgroud)
data[key2][key1] 仍然指的是对象.
我的问题是:有没有办法删除底层对象,或用虚假的东西覆盖它,这样上面的两个属性都会评估为falsey?
可以这样想:
data[key1][key2] -----> object1
^
data[key2][key1] ---------+
Run Code Online (Sandbox Code Playgroud)
如果您将其中一个(例如后者)的密钥更改为新对象,您将得到以下结果:
data[key1][key2] -----> object1
data[key2][key1] -----------> object2
Run Code Online (Sandbox Code Playgroud)
(或者如果你删除它,密钥就会丢失:)
data[key1][key2] -----> object1
data[key2]
Run Code Online (Sandbox Code Playgroud)
也就是说,您将更改其中一个引用,但不会更改另一个。任何仅替换其中一个的尝试都可以实现这一目标。您有两个选择:
a) 更改两个键以指向新对象:
data[key1][key2] -----> object2
^
data[key2][key1] ---------+
Run Code Online (Sandbox Code Playgroud)
(或者删除两个键:)
data[key1][key2] object1 (no references, will be garbage collected)
data[key2][key1]
Run Code Online (Sandbox Code Playgroud)
b) 修改对象本身的字段。这样它们仍然会指向同一个对象,但它的某些内容会有所不同。不过,您使用的任何代码都必须考虑到这一点。
data[key1][key2] -----> object1 with 'isDeleted'=true
^
data[key2][key1] ---------+
Run Code Online (Sandbox Code Playgroud)
考虑到您的用例,a) 选项似乎最有意义。如果您无论如何都有两个密钥,为什么不更新/删除两个密钥呢?
| 归档时间: |
|
| 查看次数: |
464 次 |
| 最近记录: |