2014-10-08 94 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