javascript - 对象不可变?

mki*_*ton 5 javascript

我正在尝试创建一些树形结构.

我想访问我的数据如下:

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?

Cla*_*diu 3

可以这样想:

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) 选项似乎最有意义。如果您无论如何都有两个密钥,为什么不更新/删除两个密钥呢?