我正在使用节点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
对象中的动态数组,索引会动态变化
有任何想法解决这类问题吗?我每次调用sharedVar
函数时都在考虑使用新的createNewRoom
对象,但问题是,我必须在许多不同的函数中使用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 :(得分:1)
是的,这肯定是一个问题,因为你没有以合乎逻辑的方式跟踪索引,你依赖于它改变的阵列上的位置,你需要一些不会改变的东西时间保持一致性并支持元素的删除而不影响其余元素。您可以使用mongo通过id或redis或某种键值对数据库存储生成的房间来存储该类信息。
答案 1 :(得分: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查找。