簡體   English   中英

有效地計算JavaScript中對象的鍵/屬性數

[英]Efficiently counting the number of keys / properties of an Object in JavaScript

這個問題幾乎與如何有效地計算JavaScript中對象的鍵/屬性數量相同

我想知道一條額外的信息:什么是確定對象中鍵數量的“ 恆定時間 ”方式? 我主要關心的是在Node.JS中這樣做,因為瀏覽器上的大多數對象都不是太大而不是很受關注。

編輯:似乎Object.keys(obj).length在谷歌瀏覽器和Node.JS中以線性時間O(n)返回(即取決於obj的鍵數)。 有更好的O(1)方法嗎?

我在Node.JS做了一些測試(源代碼如下)

var tests = [10e3, 10e4, 10e5, 10e6]
for(j in tests) {
    var obj = {};
    for(i = 0; i < tests[j]; i++)
        obj[i] = i;
    console.time('test' + tests[j]);
    Object.keys(obj).length;
    console.timeEnd('test' + tests[j]);
}

對於n = 10e3,10e4,10e5,10e6 ...結果是:

test10000: 5ms
test100000: 20ms
test1000000: 371ms
test10000000: 4009ms

經過一些研究,沒有辦法在恆定的時間內確定JavaScript對象中的鍵數,至少在Node ...中還沒有。 Node在內部跟蹤這些信息,但它沒有公開它,因為在ECMA-262 5th中沒有這樣做的方法。

值得注意的是,Harmony(ECMA版本6)本身可以支持地圖和集合。 不確定這些規格會變成什么樣。

我被告知我們需要在T​​C39委員會中提出這個建議。

針對V8的錯誤報告: http//code.google.com/p/v8/issues/detail? id = 1800

ECMA 6和聲介紹了你可以使用的MapSet類(將來:)

var map = new Map;
map.set('a', 'b');
console.log(map.size); // prints 1

我相信它應該具有復雜性O(1),但是沒有嘗試過。 您可以通過node --harmony script.js --harmony node --harmony script.js在節點0.11+中運行它。


另一種方法是使用Proxy也已在和諧中添加類。

查看源代碼,特別是GetLocalElementKeys

v8 objects.cc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM