JavaScript数据结构:键/值,通过值进行键访问



我需要一个数据结构来存储几个JavaScript对象,并能够使用字符串id访问它们(get/set/delete操作)。

以下是我需要存储的项目的示例:

var Player = function(name) {
  this.name = name;
  this.x = 0;
  this.y = 0;
  this.toString = function() {
    return 'player : ' + this.name + ' at ' + this.x + ', ' + this.y;
  };
}

我想把玩家存储在一个数据结构中,并能够按照他们的名字来获取/设置/删除他们,就像players.get('Bob')一样,以Bob为名字来获取玩家。

起初,我想我可以使用一个以名称为键的地图(我使用的是collectionsjs中的Dict)。但是,我无法从项的方法访问名称(在我的示例中为toString)。

我可以使用常规的Array,保留name属性并实现我自己的get/set/delete方法,但我宁愿使用可靠的数据结构,但我找不到它

提前感谢:]

Javascript对象可以工作。

var players = [];
players[0] = {"name":"Bob", "age":1};
players[1] = {"name":"John", "age":4};
for (var i in players) {
    if (players[i].name == "Bob") {
        alert("Bob is " + players[i].age);
    }
}

编辑:

var players = [];
players[0] = {"name":"Bob", "age":1};
players[1] = {"name":"John", "age":4};
players.forEach(function(player){
    if (player.name == "Bob") {
        alert("Bob is " + player.age);
    }
});
var Players = function(){
    this.players = [];
    this.add = function(player){
        this.players.push(player);
    }
    this.delete = function(name){
        for(var i=0;i<this.players.length;i++)
            if(this.players[i].name==name)
            {
                var f = this.players.slice(i+1,this.players.length+1);
                this.players = this.players.slice(0,i).concat(f);
                return;
            }
    }
    this.set = function(name,player){
            for(var i=0;i<this.players.length;i++)
            if(this.players[i].name==name)
            {
                this.players[i] = player;
                return;
            }
    }
    this.show = function(){
        for(var i=0;i<this.players.length;i++)
            console.log(this.players[i].toString());
    }
}
var p = new Players();
p.add(new Player('Lorem'));
p.add(new Player('Ipsum'));
p.show();
p.delete('Ipsum');
p.show();

数组有什么不可靠的地方?使用内置方法IMO.一个简单的例子:

var players = [];
var Player = function(name) {
    this.name = name;
    this.x = 0;
    this.y = 0;
    this.toString = function() {
        return 'player : ' + this.name + ' at ' + this.x + ', ' + this.y;
    };
}
function getPlayerByName(name){
    return players.filter(function(p){
        return p.name.toLowerCase() === name.toLowerCase();
    })[0];
}
// etc...
players.push(new Player('foo'));
var fetched = getPlayerByName('foo');
console.log(fetched);

http://jsfiddle.net/cy39sqge/

最新更新