数组的拼接项及其所有引用(子数组)

时间:2016-06-22 18:12:14

标签: javascript arrays

我想知道是否可以切片(或删除项目)数组并将此更改传输给其子项。它的孩子只有父母的一部分。

意思是,我有:

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中)。你必须打开你的控制台才能看到。

1 个答案:

答案 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