我想知道是否可以切片(或删除项目)数组并将此更改传输给其子项。它的孩子只有父母的一部分。
意思是,我有:
let myArr = [{number: 1}, {number: 2}, {number: 3}, {number: 4}];
let partRef = [];
for(let int = 0; int < myArr.length - 1; int++){
partRef.push(myArr[int]);
}
// delete here item 2 from myArr and it gets transmitted to partRef
我希望当我myArr.splice(1, 1)
(或任何删除功能)时,number 2
也会从partRef
消失。
以下plunker显示了Angular 2及其类的真实案例(所有内容都发生在class1和class2中)。你必须打开你的控制台才能看到。
答案 0 :(得分:2)
由于partRef
是一个不同于myArr
的不同数组,因此这是不可能的。但请继续阅读...
在JavaScript中,有一些方法可以使用ArrayBuffer
在同一个内存位置上查看视图,但似乎无法在此上下文中将其用作解决方案。
我建议使用proxy
来达到效果。我们的想法是,您可以捕获任何myArr.splice
调用,并将其平均应用于partRef
数组。
但首先我要注意你所拥有的循环真的归结为:
let partRef = myArr.slice(0, 3);
以下是基于代理的解决方案:
let myArr = [{number: 1}, {number: 2}, {number: 3}, {number: 4}];
let partRef = myArr.slice(0, 3);
// Our custom version of `splice`. It does the normal `splice`, but
// also performs it on `partRef`:
function mySplice () {
[].splice.apply(partRef, arguments);
return [].splice.apply(this, arguments);
}
// Redefine `myArr` as a proxy on itself, and trap any call to `splice`
myArr = new Proxy(myArr, {
get: function (obj, prop) {
// If `splice` is accessed, then use `mySplice` instead. All other
// properties are not influenced.
return (prop === 'splice') ? mySplice : obj[prop];
}
});
// Test it.
myArr.splice(1, 1);
console.log(partRef);
关于这样一个“代理”对象的好处是不能(轻松)区别于原始对象。例如,Array.isArray(myArr)
将返回true
。