Javascript 在对象中动态存储对象
这个问题可能听起来很愚蠢或者有点太简单,但我真的被卡住了 我有一个node.js应用程序,需要存储客户端,以便能够将信息从特定客户端发送到特定的其他客户端Javascript 在对象中动态存储对象,javascript,node.js,Javascript,Node.js,这个问题可能听起来很愚蠢或者有点太简单,但我真的被卡住了 我有一个node.js应用程序,需要存储客户端,以便能够将信息从特定客户端发送到特定的其他客户端 var clients = { }; var chat = io.of('/chat') .on('connection', function(socket) { socket .on('ehlo', function(data) { // mysql queries here etc to get
var clients = { };
var chat = io.of('/chat')
.on('connection', function(socket) {
socket
.on('ehlo', function(data) {
// mysql queries here etc to get client's data,
// for example session_id, customer name, ...
// got stuck here, need to save the socket in customers object like:
clients.(customer + data.get_customer_id) = { socket: socket };
我以后需要能够从不同的范围访问此属性等
基本上,我不知道这些抽象方法如何实现:
clients.addClient({ id: 123, socket: socket});
然后通过以下方式找到它们:
x = clients.findById(123);
// x now should be { id: 123, socket: socket}
首先,您可以定义一个客户机模块
//clients.js
"use strict";
var clients = {
_db: []
};
clients.findById = function(id){
for(var i=0; i < this._db.length; i++){
var client = this._db[i];
if(client.id === id){
return client;
}
}
return null;
};
clients.addClient = function(client) {
if(!this.findById(client.id)){
this._db.push(client);
}
};
module.exports = clients;
稍后在另一个模块中,您可以访问相同的数据结构:
//module2.js
var clients = require('./clients');
var client = clients.findById(id);
就这样,您可以从不同的上下文访问相同的数据结构。这里的要点是,所有模块将共享相同的
客户机对象。。。。。你想要一个数据库吗?如果按Id添加和查找所有你想要的,你可以做var clients=Object.create(null);客户端[123]=套接字;/*新增客户*/;客户[123];/*返回套接字*/
注意这不是持久性的。@BenjaminGruenbaum不不,我只想要一个能够容纳客户端对象并返回由ID标识的客户端对象的对象。我很困惑,因为Javascript数组有类似于find()
和push()
的函数,但要使用find()
之类的函数,我必须像每一个元素一样。不确定这是否好。这就是为什么我建议使用一个数据库,该数据库将对其进行索引。@BenjaminGruenbaum我只希望客户端在运行时保持,并在应用程序关闭时删除。我不想为每个发出的事件查询数据库。谢谢你,你的第二个评论给了我一个想法,还有Edwins的答案!我会在函数中使用this.\u db.push()
和this.\u db.find()
吗?当然,如果客户端数据库是一个数组,则可以使用push。我认为node.js数组没有定义find函数。但是你可以实现你自己的。看看我更新的答案。感谢更新,你能估计一下_db数组中有多少对象,findById方法会开始变慢吗?好吧,假设数组没有排序(正如我上面所做的),我认为这是一个线性搜索。这是一个O(n)
算法。随着列表的增长,查找客户机所需的时间也随之增加。您可以通过使用哈希数据结构来改进,在这种情况下,您可以将查找时间减少到O(1)
。您可以使用客户端id作为密钥。我把那个问题留给你。
//module2.js
var clients = require('./clients');
var client = clients.findById(id);