簡體   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