繁体   English   中英

通过defineProperty在javascript中添加数组 - 有更好的方法吗?

[英]Adding to an array in javascript via defineProperty - is there a better way?

目标是在2d javascript数组中创建动态“sum”行。 这是起点:

var m = [[1,2,3], [4,5,6]];

我们可以添加第三行:

Object.defineProperty(m, 2, { get: () => m[0].map((e, i)=> e + m[1][i]) })

所以现在我们的阵列是

[[1,2,3], [4,5,6], [5,7,9]]

有用! 设置m[0][0]=10 ,我们得到

[[10,2,3], [4,5,6], [14,7,9]]

这正是我想要的。 m.length = 3如预期的那样,因此sum行被视为数组的一部分。 JSON.stringify按预期工作。 (我有点惊讶它工作了)。

我的问题是 - 是否有一种方法可以生成依赖于其他部分的二维数组的部分,而无需使用defineProperty 这是要避免的吗?

(注意 - 在我最初的问题中,我已经完成了上述操作,然后将m[2]更改为其他内容。“属性”赢得了阵列成员,这导致了一些混乱。这本身可能是不使用以上方法.Apolgies。)

有用! 我有点惊讶它工作了。

是。 数组只是具有特殊.length属性的对象,索引只是普通属性。 这意味着你可以根据需要制作它们。

顺便说一句,你可以通过在getter中使用this来改进它,而不是总是指m

var thirdRowDescriptor = {
    enumerable: true,
    configurable: true,
    get() {
        return this[0].map((x, i) => x + this[1][i]);
    }
};
Object.defineProperty(m, 2, thirdRowDescriptor);
// or use the same descriptor on any other arrays

有没有一种更好的方法来生成依赖于其他部分的二维数组的部分,而不需要使用defineProperty?

不,使用Object.defineProperty创建的getter似乎正是您想要的。 动态生成依赖于其他数组的数组还有很多其他方法,但它们都没有真正使它成为外部数组的“一部分”。

这是要避免的吗?

有可能。 我很确定它会破坏外部阵列(你添加了getter)的性能,因为引擎无法轻松优化索引访问。 但是,如果那只是一个你想要添加另一列的双列对象,那么这应该不是问题。 只是不要在大型​​数组或动态增长/缩小的数组上执行此操作。 如果外部结构的普通对象(不是数组)可能是更好的选择,如果它的结构仍然是静态的。

见下面的结果:m [2]是一个函数。 结果与你说的不一样。

 m = [[1, 2, 3], [4, 5, 7]]; m[2] = () => m[0].map((e, i) => e + m[1][i]); console.log(m); console.log(Array.isArray(m[2])) console.log(m[2]()); console.log(typeof(m[2])); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM