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

时间:2016-09-17 09:43:36

标签: javascript arrays function

目标是在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。)

2 个答案:

答案 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]));