如何在Javascript中创建数组之间的主/从关系?

如何在Javascript中创建数组之间的主/从关系?,javascript,arrays,pointers,reference,Javascript,Arrays,Pointers,Reference,我正在寻找一种方法来构建一个包含我的“真实”对象的主数组,以及一个包含对主数组中包含的对象子集的引用的从属数组,这样,对主数组中对象的任何添加/修改/删除操作都会反映在子数组中 我希望获得的优势是,我只需要更改主控中的对象,所有从控阵列都将简单地反映这些更改 工作示例:(修改) 非工作示例:(删除) 这可能吗?尝试改用构造函数: 功能主从(主阵列、从子集){ this.master=masterArray; this.subset=slaveSubset==未定义?0:slaveSubset

我正在寻找一种方法来构建一个包含我的“真实”对象的主数组,以及一个包含对主数组中包含的对象子集的引用的从属数组,这样,对主数组中对象的任何添加/修改/删除操作都会反映在子数组中

我希望获得的优势是,我只需要更改主控中的对象,所有从控阵列都将简单地反映这些更改

工作示例:(修改)

非工作示例:(删除)


这可能吗?

尝试改用构造函数:

功能主从(主阵列、从子集){
this.master=masterArray;
this.subset=slaveSubset==未定义?0:slaveSubset;
this.slave=函数(){
返回[this.master[this.subset]];
}
}
var疯狂=新主从([{a:'hello'},{b:'world'}]);
疯狂。大师[0]。a='foo';
console.log(疯狂的.slave());
疯狂。主。拼接(0,1);

console.log(疯狂的.slave())尝试改用构造函数:

功能主从(主阵列、从子集){
this.master=masterArray;
this.subset=slaveSubset==未定义?0:slaveSubset;
this.slave=函数(){
返回[this.master[this.subset]];
}
}
var疯狂=新主从([{a:'hello'},{b:'world'}]);
疯狂。大师[0]。a='foo';
console.log(疯狂的.slave());
疯狂。主。拼接(0,1);

console.log(疯狂的.slave())上面的工作示例之所以有效,是因为
slave[0]
master[0]
的别名。 这行代码:

var master = [{a: "hello"}, {b:"world"}];
创建了三个对象:一个由名称
master
引用的数组对象和两个未命名对象
{a:“hello”}
{b:“world”}
,它们分别被命名对象
master
引用为
master[0]
master[1]

那么这一行:

var slave = [master[0]];
已创建对现有对象的新引用
{a:“hello”}
。现在
master[0]
slave[0]
都引用了相同的对象。请注意,此处数组对象
master
slave
之间没有隐藏链接

现在,当您通过一个别名修改此对象时:

master[0].a = "foo";
这些更改在被任何其他别名引用时可见:

console.log(slave);
在非工作示例中,您删除了数组
master
中引用的副本,但未触及数组
slave
中的副本<代码>从属
未看到对主
的更改

要获得所需的行为,您需要为slave提供对主数组的引用,并使用getter方法检索状态,以便在请求slave的状态时,该方法可以发现其子集中的哪些元素不再有效

下面是该逻辑的可能实现

功能从机(主、子集){
返回{
获取:()=>{
让结果=[];
subset.forEach(e=>{
if(~master.indexOf(e))result.push(e);
});
返回结果;
},
};
}
var master=[{a:“你好”},{b:“世界”}];
var slave=从(主,[master[0]])//从属是主的子集,仅包含1个元素
master[0]。a=“foo”;
log('期望的结果:[{“a”:“foo”}');
log('实际结果:'+JSON.stringify(slave.get(),null,0));
主接头(0,1)//从属[0]是对主[0]的引用,现在需要删除它
log('期望的结果:[]);

log('实际结果:'+JSON.stringify(slave.get(),null,0))上面的工作示例之所以有效,是因为
slave[0]
master[0]
的别名。 这行代码:

var master = [{a: "hello"}, {b:"world"}];
创建了三个对象:一个由名称
master
引用的数组对象和两个未命名对象
{a:“hello”}
{b:“world”}
,它们分别被命名对象
master
引用为
master[0]
master[1]

那么这一行:

var slave = [master[0]];
已创建对现有对象的新引用
{a:“hello”}
。现在
master[0]
slave[0]
都引用了相同的对象。请注意,此处数组对象
master
slave
之间没有隐藏链接

现在,当您通过一个别名修改此对象时:

master[0].a = "foo";
这些更改在被任何其他别名引用时可见:

console.log(slave);
在非工作示例中,您删除了数组
master
中引用的副本,但未触及数组
slave
中的副本<代码>从属
未看到对主的更改

要获得所需的行为,您需要为slave提供对主数组的引用,并使用getter方法检索状态,以便在请求slave的状态时,该方法可以发现其子集中的哪些元素不再有效

下面是该逻辑的可能实现

功能从机(主、子集){
返回{
获取:()=>{
让结果=[];
subset.forEach(e=>{
if(~master.indexOf(e))result.push(e);
});
返回结果;
},
};
}
var master=[{a:“你好”},{b:“世界”}];
var slave=从(主,[master[0]])//从属是主的子集,仅包含1个元素
master[0]。a=“foo”;
log('期望的结果:[{“a”:“foo”}');
log('实际结果:'+JSON.stringify(slave.get(),null,0));
主接头(0,1)//从属[0]是对主[0]的引用,现在需要删除它
log('期望的结果:[]);

log('实际结果:'+JSON.stringify(slave.get(),null,0))澄清-我假设对从属阵列的更改不应影响主阵列,这是正确的吗?这可能是可能的,但如果出于任何原因,您需要在代码中使用它,您可能应该