2

私たちは最近 JavaScript の「ハッシュ」を頻繁に使用しており、count メソッド以外で扱っているものを「知る」必要なく、配列とハッシュの両方に含まれる項目をカウントする普遍的な方法を探していました。誰もが知っているように、配列内の最大のインデックスの値のみを返すため、.length は役に立ちません。以下にあるものは機能しません。なぜなら、ハッシュは Array に対して true をテストするからです。当初、プロジェクト全体で .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.keysES5-shimから逐語的にコピーされた polyfill

// 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 に答える