2016-09-17 47 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] ,你是對的,我錯過了什麼,我會重寫這個問題 –

相關問題