2016-09-17 53 views
2

的目标是在2D阵列的JavaScript来创建一个动态“总和”行中。这里的出发点:添加到一个数组在javascript - 有没有更好的办法?

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如预期的,所以总和行被视为阵列的一部分。 JSON.stringify也按预期工作。 (我有点惊讶它的工作tbh)。

我的问题是 - 有产生依赖于其他部分的2D阵列的部分不诉诸defineProperty的方法吗?这是要避免的吗? (注意 - 在我原来的问题中,我已经完成了上述操作,然后将m[2]更改为其他内容。'属性'胜过数组成员,这导致了一些混淆,这本身可能是一个不使用的理由上述方法Apolgies)

+1

必须有更多的代码,你没有显示。该功能正在执行。 –

+1

您在[] [[1,2,3],[4,5,6],[5,7,9]]' – Marcs

回答

2

它的工作原理!我有点惊讶它的工作tbh。

是的。数组只是具有特殊属性的对象,索引只是普通属性。这意味着如果你愿意,你可以让他们成为制片人。

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 

有生成一个二维数组的部分依赖于无其他部位更好的办法:

顺便说一句,你可以通过在吸气用this而不是总指m提高对诉诸defineProperty?

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

这是要避免的吗?

可能。我敢肯定它会破坏外层数组(你添加了getter)的性能,因为引擎无法轻松优化索引访问。但是,如果这实际上只是您想要添加其他列的两列对象,这应该不成问题。只是不要在大型​​数组或动态增长/收缩的数组上进行。如果它的结构是静态的,也许使用一个普通对象(不是数组)是一个更好的选择。

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

+0

apolgies之前在某处调用了'm [2] = m [2] ,你是对的,我错过了什么,我会重写这个问题 –

相关问题