2

我们最近一直在使用 javascript“哈希”,我们一直在寻找一种通用的方法来计算数组和哈希中包含的项目,而无需“知道”我们正在处理的项目,除了 count 方法。众所周知,.length 是无用的,因为它只返回数组中最高索引的值。我们下面的内容不起作用,因为哈希对 Array 测试为真,但返回的长度值对于哈希来说是废话。我们最初将整个项目中的 .length 替换为 Object.keys().length,但 IE8 及更低版本不支持此功能。

这是一个如此愚蠢的简单事情,我们似乎无法让它工作。帮帮我,欧比万。你是我唯一的希望!

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;
}
4

2 回答 2

3

Object.keyspolyfill 从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;
    };

}
于 2012-04-05T16:17:25.600 回答
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
}

为什么我这样做是简单的性能循环通过一个对象来计算属性长度将非常低效,上面的解决方案始终让您直接访问。

于 2012-04-05T16:27:43.823 回答