2014-10-08 56 views
0

我需要一个数据结构来存储多个JavaScript对象,并能够使用字符串ID(get/set/delete operations)访问它们。JavaScript数据结构:通过键值访问的键/值

这里是我需要存储的物品的例子:

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)。

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

在此先感谢:]

+0

这听起来好像骨干完美的候选人:http://backbonejs.org/。另外,我认为你应该重命名'toString'方法,因为'toString'已经存在于JS对象中。 – 76484 2014-10-08 02:40:14

+0

简单的旧对象有什么问题? – 2014-10-08 02:48:01

+1

@ 76484:为了允许自定义对象覆盖它们,存在'toString'方法,以便当它被强制进入字符串上下文(例如''+ player')时,它会生成正确的字符串表示,而不是通用的'[Object object]'。这正是它在这里使用的。 – slebetman 2014-10-08 04:34:29

回答

0

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); 
    } 
}); 
+0

你应该*不*使用数组:http://stackoverflow.com/a/5263872/3397771 – 76484 2014-10-08 02:16:36

+0

而不是用foreach编辑。 – 2014-10-08 02:33:35

+0

@ 76484-你*不应*做出不适用于所有情况的概括。 – RobG 2014-10-08 02:46:00

0
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(); 
+0

不支持代码的答案。你应该回答OP的问题,并解释为什么你的回答解决了问题中的所有问题,或者为什么优先于其他选项。 – RobG 2014-10-08 02:43:47

0

什么是不可靠的有关阵列?使用内置方法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/

+0

我并不是说数组不可靠,但是我的get/set/delete/...的实现可能是。这就是为什么我想要一个已经过测试和优化的开源库。 我想我会承担风险并自己实施。 – Owumaro 2014-10-09 13:25:00