目标是在2d javascript数组中创建动态“sum”行。这是起点:
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
这正是我想要的。 JSON.stringify
如预期的那样,因此sum行被视为数组的一部分。 defineProperty
也按预期工作。 (我有点惊讶它工作了)。
我的问题是 - 是否有一种方法可以生成依赖于其他部分的二维数组的部分,而无需求助于m[2]
?这有什么可以避免的吗?
(注意 - 在我最初的问题中,我已经完成了上述操作,然后将min(A) + max(B) == min(B) + max(A)
更改为其他内容。'属性'赢得了阵列成员,这导致了一些混乱。这本身可能是一个原因不要使用上述方法.Apolgies。)
答案 0 :(得分:2)
有效!我有点惊讶它工作了。
是。数组只是具有特殊.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)的性能,因为引擎无法轻松优化索引访问。但是,如果那只是一个你想要添加另一列的双列对象,那么这应该不是问题。只是不要在动态增长/缩小的大型阵列或阵列上进行此操作。如果外部结构使用普通对象(不是数组),如果它的结构是静态的,那么它可能是更好的选择。
答案 1 :(得分:0)
见下面的结果: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]));