2016-12-06 16 views
0

ノードjsを使用してテレグラム上にゲームボットを作成しています。Javascript/Node Js - インスタンスごとに新しい変数を作成する

現在、私は共有変数(module.exports)の問題に直面しています。変数のデータの一部を保存しています。そして問題は、共有変数インデックスが常に変化することです。たとえば、あなたが見ることができるように、私はそれを呼び出すとき、それはsharedVar最後値が表示されます、callGameData機能を持っ

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 

     } 

下の私のコードを参照してください、電流を表示するためにを想定しています部屋の値/データ。

私は上記のコードで言及したように、すべてのsharedVarオブジェクト内の動的配列についてです、インデックスは、この種の問題に取り組むために、動的に

任意の考えを変えるのだろうか?私は新しいsharedVarオブジェクトを使用することを考えていましたが、createNewRoom関数が呼び出されるたびに、多くの異なる関数でsharedVarを使用しなければなりません。

EDIT

これは、あなたが上の位置に依存している、論理的な方法でインデックスを追跡していない原因はい、それは間違いなく問題だ

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 
} 

2つの要素を追加した後、あなたは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

あなたの編集された投稿を見た後、私はあなたが何を意味するのか知っていると思います。 1時間まで30分、最初に試してみたいと思って、アップデートして戻ってきます。ありがとう – Webster

1

第二の方法であります配列が変更されると、一貫性を保つために時間の経過とともに変化しない要素が必要であり、残りの要素に影響を与えずに要素の削除をサポートします。 mongoを使用して、生成された部屋をIDで保存するか、または多少の種類のキーバリューペアデータベースを使用してそのような情報を保存することができます。

+0

ehm、大丈夫、私は前にmariadbを使っています。私はすべてのデータ(IDなど)を格納するためにmariadbを使用しました。問題はないので、代わりにキャッシュを使用するように変更したのはなぜですか?パフォーマンス、ええ、私は選択クエリや何かを実行する必要はありません、それは超高速ですが、ええ、今私はこの問題を発見した。 – Webster

+0

今回はある種のIDが必要ですが、配列インデックスに頼ることはできません。データベースを避けたい場合は、プロパティIDを持つ単純な配列の代わりにオブジェクトを使用できます。...... { id:23、otherFields ......}と配列にプッシュすると、問題なくオブジェクトを削除し、残りのオブジェクトIDの一貫性を保つことができます。 – Juan

+0

申し訳ありませんが、私はまだそれを得ることはできません、私を許してください。しかし、それは私がやったのと同じコンセプトにはなりませんか?または私がそれを得ることはありません – Webster

関連する問題