2011-10-31 65 views
19

此問題與How to efficiently count the number of keys/properties of an object in JavaScript?幾乎完全相同。有效計算JavaScript中對象的鍵/屬性數

我想知道一個額外的信息:什麼是「恆定時間」的方式來確定一個對象中的鍵的數量?我最關心的是在Node.JS中這樣做,因爲瀏覽器上的大多數對象都不是太大而不值得擔心。

編輯: 看來,線性時間爲O(n)在谷歌瀏覽器和在Node.js的Object.keys(obj).length返回(即依賴於密鑰的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 
+0

您是否嘗試過測試? – Blender

+0

沒有。我今天感覺很慵懶...:/我想是星期一的例子。 – BMiner

+2

我懷疑從調用「Object.keys()」的結果中獲取「.length」是恆定時間,但我也懷疑調用「Object.keys()」在屬性數量上是線性的。 – Pointy

回答

1

看到源,特別是GetLocalElementKeys

v8 objects.cc

+0

我懶得這樣做。英文,請。我很樂意接受你的回答。 :P – BMiner

+0

根據對象包含的內容,它們做了不同的事情,最壞的情況似乎是在循環所有元素。 – Andrew

5

了一些研究之後,沒有辦法在常量時間內確定JavaScript對象中的鍵的數量,至少不是在Node中......並且還沒有完成。節點內部保持跟蹤這些信息,但它不公開它,因爲在ECMA-262 5th中沒有這樣做的方法。

值得注意的是,Harmony(ECMA版本6)可能本機支持地圖和集合。不知道這些規格會變成什麼樣子。

我被告知,我們需要提出與TC39委員會。對於V8

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

1

ECMA 6和諧介紹MapSet類,你或許可以利用(在未來:)

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

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


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

相關問題