Node JS 中用于订阅者列表的关联数组
Associative arrays in Node JS for a list of subscribers
我需要在 Node JS 中创建一个 “订阅者”列表,它将提供一个 设备 (字符串) 他们希望在有新数据时收到通知,IP 和端口 (两个字符串) 转发数据。 列表应该是唯一的;即,列表中应该只有一个(设备、IP、端口)组合。当数据来自设备时,我还需要有效地获取 IP/Port 订阅者的子列表,以了解将数据转发到何处。
在其他语言中,我为此使用了关联数组(具有唯一索引),所以使用类似这样的东西;
subscribers[device] = (IP,Port)
解决了问题。因此,当新数据来自 设备 时,使用设备索引过滤数组,给我一个 订阅者列表 以将数据转发到。
我想知道在 Node JS 中实现它的最佳方法是什么。我正在查看数组,但没有找到关联数组,而且我不确定是否有其他方法是更好的方法...
提前致谢
古斯
一个适用于您的用例的简单解决方案是使用 Map of Sets 字符串,您可以在其中连接 IP 地址和端口:
const subscribers = new Map<string, Set<string>>();
function addSubscriber(device: string, ip: string, port: number) {
let set = subscribers.get(device);
if (!set) {
set = new Set<string>();
subscribers.set(device, set);
}
// Lowercase in case your IP is an IPv6 and can have random upper/lower case
set.add(`${ip.toLowerCase()}:${port}`);
}
const splitCombo = (combo: string): [string, number] => {
const split = combo.split(':');
return [split[0], parseInt(split[1])];
};
function getSubscribers(device: string): [ip: string, port: number][] {
const set = subscribers.get(device);
if (!set) return [];
return Array.from(set).map(splitCombo);
}
用 TypeScript 编写以向您展示类型
否则,您需要创建自己的关联 map/list 变体。仍然有可能而且可能很有趣,但也比这个简单的变体复杂得多。例如。将 Set<string>
替换为 [string, number][]
数组,但是如果该对已经存在,则您必须在添加新对时手动检查。使用 Set<string>
,.add
将非常有效地为您解决这个问题。
我需要在 Node JS 中创建一个 “订阅者”列表,它将提供一个 设备 (字符串) 他们希望在有新数据时收到通知,IP 和端口 (两个字符串) 转发数据。 列表应该是唯一的;即,列表中应该只有一个(设备、IP、端口)组合。当数据来自设备时,我还需要有效地获取 IP/Port 订阅者的子列表,以了解将数据转发到何处。
在其他语言中,我为此使用了关联数组(具有唯一索引),所以使用类似这样的东西;
subscribers[device] = (IP,Port)
解决了问题。因此,当新数据来自 设备 时,使用设备索引过滤数组,给我一个 订阅者列表 以将数据转发到。
我想知道在 Node JS 中实现它的最佳方法是什么。我正在查看数组,但没有找到关联数组,而且我不确定是否有其他方法是更好的方法...
提前致谢 古斯
一个适用于您的用例的简单解决方案是使用 Map of Sets 字符串,您可以在其中连接 IP 地址和端口:
const subscribers = new Map<string, Set<string>>();
function addSubscriber(device: string, ip: string, port: number) {
let set = subscribers.get(device);
if (!set) {
set = new Set<string>();
subscribers.set(device, set);
}
// Lowercase in case your IP is an IPv6 and can have random upper/lower case
set.add(`${ip.toLowerCase()}:${port}`);
}
const splitCombo = (combo: string): [string, number] => {
const split = combo.split(':');
return [split[0], parseInt(split[1])];
};
function getSubscribers(device: string): [ip: string, port: number][] {
const set = subscribers.get(device);
if (!set) return [];
return Array.from(set).map(splitCombo);
}
用 TypeScript 编写以向您展示类型
否则,您需要创建自己的关联 map/list 变体。仍然有可能而且可能很有趣,但也比这个简单的变体复杂得多。例如。将 Set<string>
替换为 [string, number][]
数组,但是如果该对已经存在,则您必须在添加新对时手动检查。使用 Set<string>
,.add
将非常有效地为您解决这个问题。