2012-04-05 91 views
2

最近我們一直在使用JavaScript「哈希」,我們一直在尋找一種通用的方法來計算包含在數組和哈希中的項目,而不必「知道」我們正在處理的除了在計數方法。衆所周知,.length是無用的,因爲它只返回數組中最高索引的值。我們下面的內容不起作用,因爲哈希對數組測試爲true,但返回的長度值對於哈希來說是廢話。我們最初用Object.keys()。length替換了整個項目的長度,但在IE8及更低版本中不支持。如何獲得javascript「數組」的長度

這是一個愚蠢的簡單的事情,我們似乎無法得到它的工作。幫助我,歐比萬。你是我唯一的希望!

function isNullOrUndefined(aObject) { 
    "use strict"; 
    return (typeof aObject === 'undefined' || aObject === null); 
} 

function count(aList) { 
    "use strict"; 
    var lKey = null, 
     lResult = 0; 
    if (!isNullOrUndefined(aList)) { 
     if (aList.constructor == Array) { 
      lResult = aList.length; 
     } else if (!isNullOrUndefined(Object.keys)) { 
      lResult = Object.keys(aList).length; 
     } else { 
      for (lKey in aList) { 
       if (aList.hasOwnProperty(lKey)) { 
        lResult++; 
       } 
      } 
     } 
    } 
    return lResult; 
} 
+0

散列只是一個文字對象嗎? – elmuchacho 2012-04-05 16:17:39

回答

1

逐字複製鄙視從Raynos答案是完全有效的,請考慮性能

這是我的哈希對象看怎麼樣

function Hash(){ 
    this.values = []; 
    this.keys = {}; 
} 
Hash.prototype.set = function(key, val){ 
    if(this.keys[key]){ 
     this.values[this.keys[key]] = value 
    }else{ 
     this.keys[key] = (this.values.push(val)-1) 
    } 
} 
Hash.prototype.length = function(){ 
    return this.values.length 
} 

爲什麼我這樣做是簡單的性能循環通過一個對象來計算屬性的長度將是非常低效的解決方案上面給你直接訪問所有的時間。

+0

確保你的「長度」運算符速度更快,但是你的內存使用量增加了,你的'set'運算符速度要慢得多。你需要真正的基準來找出你的瓶頸在哪裏。這也傷害了可讀性並引入了不必要的複雜性。 'Object.keys'不是那麼慢 – Raynos 2012-04-05 19:43:34

+0

我同意你對標杆的評論。我們不必經常計數,所以Object.keys對我們正在做的事情很有幫助。但是,上述散列思想對於某些應用程序來說非常好。 – 2012-04-06 04:13:08

3

Object.keys填充工具從ES5-shim

// ES5 15.2.3.14 
// http://es5.github.com/#x15.2.3.14 
if (!Object.keys) { 
    // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation 
    var hasDontEnumBug = true, 
     dontEnums = [ 
      "toString", 
      "toLocaleString", 
      "valueOf", 
      "hasOwnProperty", 
      "isPrototypeOf", 
      "propertyIsEnumerable", 
      "constructor" 
     ], 
     dontEnumsLength = dontEnums.length; 

    for (var key in {"toString": null}) { 
     hasDontEnumBug = false; 
    } 

    Object.keys = function keys(object) { 

     if ((typeof object != "object" && typeof object != "function") || object === null) { 
      throw new TypeError("Object.keys called on a non-object"); 
     } 

     var keys = []; 
     for (var name in object) { 
      if (owns(object, name)) { 
       keys.push(name); 
      } 
     } 

     if (hasDontEnumBug) { 
      for (var i = 0, ii = dontEnumsLength; i < ii; i++) { 
       var dontEnum = dontEnums[i]; 
       if (owns(object, dontEnum)) { 
        keys.push(dontEnum); 
       } 
      } 
     } 
     return keys; 
    }; 

} 
+1

如果不清楚OP:這是一個使IE8中的Object.keys工作的基礎。 – 2012-04-05 16:19:05

+0

Raynos,我給你一個upvote,因爲 - hazah!這就是我們今天需要的!但我會給予elmuchacho解答,因爲這是我們長期需要的。非常感謝你! – 2012-04-05 19:37:47