【发布时间】:2016-01-28 02:08:46
【问题描述】:
在我的一个脚本中,我广泛使用数组来临时存储数据。我面临的问题是我有很多代码处理数组,所以我可以经济地利用空间。
既然 Node.js 数组是关联数组,我还要麻烦吗?
我目前的解决方案是:
//Get the minimum empty id in array
function get_id(callback) {
var i = 0;
while(array[i] != null) {
i = i + 1;
}
array[i] = 0;
callback(i);
}
get_id(function (i) {
array[i] = {large object};
//...
array[i] = null;
});
但我觉得这是错误的并且容易出错。
我可以这样做吗:
array[i] = {large object};
i = i + 1;
//...
array[i] = null;
还是会导致大量内存消耗?
array 是使用它的模块的全局变量。
减少代码(我已经删除了所有未链接到数组 player.active_mission 的计算):
var player = {},
missions = [{time: 1000}];
function end_mission(mission, squad, mission_log, callback) {
//Make all the computing of the mission to know if the player won...
callback(mission_log);
}
function get_ami(callback) {
var i = 0;
while(player.active_mission[i] != null) {
i = i + 1;
}
player.active_mission[i] = 0;
callback(i);
}
function wait_mission(mission, squad, mission_log, i, time, callback) {
setTimeout(function () {
console.log('End of mission');
player.active_mission[i] = null;
end_mission(mission, squad, mission_log, callback);
}, time);
}
function start_mission(mission, squad, callback) {
var mission_log = {mission: mission, time_start: new Date(), completed: false, read: false};
//Verify if the player can start the mission...
console.log('start_mission');
get_ami(function (i) {
player.active_mission[i] = {mission: mission, squad: squad, mission_log: mission_log}
wait_mission(mission, squad, mission_log, i, missions[mission].time, callback);
});
}
player.active_mission = [];
//This part is inside get request, after sanitizing all input
start_mission(0, [0, 1], function (r) {
//r.id = req.session.player_id;
if(r.error) {
console.log('start: error: ' + r.error);
} else {
console.log('start: Success: ' + r.result);
}
});
player.active_mission 保存玩家所有未完成的请求,如果玩家在完成前退出需要保存。我的问题是我应该尝试使用小 id 保留它,还是继续使用 .push() 并使用 .length() 获取 id?
简而言之:如果一个数组只有 null 用于第 1000 个第一个 id,并且仅在数组 [1000] 处开始有数据,我是否在浪费内存?
【问题讨论】:
-
清洁是什么意思?
-
array来自哪里(它在哪里声明,它的作用域和生命周期是什么)?为什么要把大对象放在数组里呢? -
请向我们展示您的完整代码。
-
@Bergi: 数组是模块中的全局变量,因为我必须能够转储所有当前请求,我发现最好将它们全部放在一个数组中,而不是尝试获取所有等待进程并转储它们。
-
“等待进程”是什么意思?你在这里做任何异步的事情吗?您的
get_id示例看起来像您将对象放在函数开头的数组中,并在最后删除它。你真的在用它做什么?实际代码会有所帮助。
标签: javascript arrays node.js