2012-04-05 102 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