在Javascript中模拟地图/集

时间:2011-03-02 19:18:53

标签: javascript arrays json

我有一个json对象,比如box = {};,我会继续添加像box['somename'] = somevalue这样的键值。可能会重复somename,我希望最后一个实例的值获胜。这一切都很好。

现在我需要对它进行操作,就像它是一个数组一样。基本上,既然我有一组唯一键,我想要一个主要操作box.length来查看有多少个唯一元素。是否有一种优雅的恒定时间方式,而不必遍历此对象的所有属性?

2 个答案:

答案 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