我有一个json对象,比如box = {};
,我会继续添加像box['somename'] = somevalue
这样的键值。可能会重复somename
,我希望最后一个实例的值获胜。这一切都很好。
现在我需要对它进行操作,就像它是一个数组一样。基本上,既然我有一组唯一键,我想要一个主要操作box.length
来查看有多少个唯一元素。是否有一种优雅的恒定时间方式,而不必遍历此对象的所有属性?
答案 0 :(得分:9)
var box = {
length: 0,
add: function(k, v) {
if (typeof this[k] === 'undefined')
this.length++;
this[k] = v;
}
}
答案 1 :(得分:4)
每次向box
添加新元素时递增计数器。
function Box() {
var length = 0;
var items = {};
this.add = function(k, v) {
if (!(k in items))
length++; // don't count twice
items[k] = v;
}
this.get = function(k) {
return items[k];
}
this.delete = function(k) {
if (k in items)
length--;
delete items[k];
}
this.__defineGetter__("length", function() {
return length;
});
}
此版本正确处理添加和删除任何名称的元素,并提供对length
属性的只读访问权限。用法:
var box = new Box();
box.add("a", 1);
box.add("a", 2); // overwrite
box.add("b", "whatever");
box.add(null, 3);
box.add(undefined, 3);
box.add(undefined, 42);
box.add("", 41);
console.log(box.length); // 5
console.log(box.get(undefined)); // 42
console.log(box.get(null)); // 3
console.log(box.get("")); // 41
box.delete(undefined);
box.delete(undefined);
box.delete(undefined);
box.delete(undefined);
box.delete(undefined);
box.delete(undefined);
box.delete(22); // never was defined
console.log(box.length); // 4
console.log(box.get(undefined)); // undefined
box.add("length", "33")
box.add("items", "jfhsdjkfh");
box.add("length", 77);
console.log(box.length); // 6