2016-12-06 82 views
0

我使用節點js在電報上創建了一個遊戲機器人。Javascript/Node Js - 爲每個實例創建新變量

目前我在共享變量(module.exports)上遇到問題。我在變量上存儲了一些數據。問題是,共享變量索引總是改變。例如,請參考我下面的代碼

var sharedVar = []; 

createNewRoom = function(res) { 

var index = sharedVar.length; 

sharedVar.push({ groupId : res.chat.id }); // every time this function is invoked, it will create a new array inside sharedVar object 

//Here comes the problem, it's about the index, 
//because I'm using sharedVar to store arrays, then it will become a problem, 
//if one array is deleted (the index will change) 

var groupId = sharedVar[index].groupId; // it runs OK, if the structure of array doesn't change, but the structure of array change, the index will be a wrong number 

     } 

正如你所看到的,我得到了callGameData功能,當我叫它,它會顯示的sharedVar最後值,它應該,顯示當前房間價值/數據。

正如我在上面的代碼中提到,它是所有關於在sharedVar對象的動態數組,該指數將改變動態

任何想法來解決這種問題?我一直在考慮在每次調用createNewRoom函數時使用新的對象sharedVar,但事情是,我必須在許多不同的函數中使用sharedVar,並且我仍然無法在使用該方法時弄清楚它。

編輯

這是第二種方法

var gameData = undefined; 

createNewRoom = function() { 
this.gameData = new myConstructor([]); // it will instantiate a new object for each new room 

} 

myConstructor = function(data) { 
var _data = data; 
this.object = function() { 
    return _data; 
} 
} 

callGameData = function() { 
console.log(gameData); 
} 
+0

你究竟需要什麼數組?如果每個房間都應該有自己的ID(索引),爲什麼還要分享? – Bergi

+0

來存儲數據。是的,這就是我在我的帖子上寫的,我想爲每個房間創建一個獨立變量,例如使用構造函數,但問題是,我仍然必須在全局變量上定義變量,因爲我有很多使用變量 – Webster

+0

請向我們展示這些函數,沒有代碼,我們幾乎無法建議您做任何事情。他們是房間的方法嗎? – Bergi

回答

1

如果您希望在刪除條目時保持索引相同,則數組基本上是錯誤的數據類型。

更好的方法是使用對象的屬性。例如:

var roomCache = { nextId: 1 }; 

createNewRoom = function(res) { 
    roomCache[roomCache.nextId++] = {groupId: res.chat.id}; // Add a new object to the cache and increment the next ID 
} 

增加兩個元素後,你就會有客房roomCache[1]roomCache[2] - 如果你想在零開始只是改變nextId的原始值。您可以刪除此對象中的元素,並且不會移動任何其他對象的任何鍵 - 例如,僅使用delete roomCache[1]即可擺脫該條目。

這假設沒有更好的ID用於緩存 - 例如,如果通過res.chat.id查找它更有意義,您當然可以將它用作roomCache的關鍵字,而不是一個自動遞增的數字。下面介紹如何通過組ID來緩存值:

var roomCache = { }; 

createNewRoom = function(res) { 
    roomCache[res.chat.id] = {groupId: res.chat.id}; // Assumes res.chat.id is not a duplicate of an already cached obhect 
} 

現在,您只需在緩存中按組ID查找即可。

+0

嗨,夥計,好吧,讓我們假設roomCache [1]被刪除,同時我必須知道哪個roomCache索引存儲了哪個組數據值。這與我以前做過的事情不一樣嗎?因爲我仍然需要遍歷roomCache數組來找出哪個索引存儲正確的組數據值?不是嗎? – Webster

+1

當我談到「一個更好的ID可以使用」時,這就是我所指的。如果您主要是通過res.chat.id值來查找,那麼我會將其添加到答案中。 – PMV

+0

,我看到你編輯的文章後,我想我知道你的意思。給我30分鐘,直到1小時,想先嚐試一下,然後會回覆給你更新。謝謝 – Webster

1

是的,這絕對是一個問題,因爲你沒有保持跟蹤該指數的一個合乎邏輯的方式,你是靠上的位置上數組,它需要改變,你需要一些不會隨時間變化的數據來保持一致性,並支持元素的刪除而不影響其餘元素。您可以使用mongo通過id或redis或某種鍵值對數據庫來存儲生成的房間以存儲該類信息。

+0

艾姆,好的,我以前一直在使用mariadb。當我用mariadb存儲所有的數據(ID等)。它沒有問題,爲什麼我改爲使用緩存呢?性能,燁,我不必運行一個選擇查詢或東西,這是超快,但是,現在我發現這個問題。 – Webster

+0

這次你需要某種形式的id,你不能依賴數組索引.....或者你可以使用對象而不是帶有屬性id的簡單數組如果你想避免數據庫...... { id:23,otherFields ......}並將它推入一個數組中,這樣就可以在沒有任何問題的情況下刪除該對象,並保持其他對象的一致性。ids ....(我假設你不想用這個解決方案堅持任何這些數據) – Juan

+0

對不起,我還是不明白哈哈,原諒我。但是,這不是像我所做的那樣的概念嗎?或者可能是我不明白夥計 – Webster

相關問題