[英]How to efficiently count the number of keys/properties of an object in 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)本身可以支持地圖和集合。 不確定這些規格會變成什么樣。
我被告知我們需要在TC39委員會中提出這個建議。
針對V8的錯誤報告: http : //code.google.com/p/v8/issues/detail? id = 1800
ECMA 6和聲介紹了你可以使用的Map
和Set
類(將來:)
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.