我们最近一直在使用javascript“哈希”,我们一直在寻找一种通用的方法来计算数组和哈希中包含的项目而不必“知道”我们正在处理的内容除了计数方法。众所周知,.length是无用的,因为它只返回数组中最高索引的值。我们下面的内容不起作用,因为散列测试对于Array是真的,但返回的长度值是散列的废话。我们最初用Object.keys()。length替换了整个项目的.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;
}
答案 0 :(得分:3)
Object.keys
polyfill从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 :(得分: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
}
为什么我这样做是简单的性能循环通过一个对象来计算属性长度将是非常低效的上述解决方案让你一直直接访问。