You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按用户名聚合不同ID用户的关联IoT设备总数?

按用户名聚合IoT设备总数的最优实现方案

核心思路

通过三次线性遍历完成统计,利用哈希表(Map/字典)实现O(1)的查找与更新,整体时间复杂度为O(N + M)(N为用户数组长度,M为关联IoT设备数组长度),是效率最高的线性时间方案。具体步骤:

  1. 建立「用户ID→用户名」的映射表,快速通过用户ID获取用户名。
  2. 统计每个用户ID对应的关联IoT设备数量。
  3. 按用户名合并不同用户ID的设备数量,得到最终聚合结果。

数据示例

假设输入的三个JSON数组结构如下:

  • 用户数组:
[
  {"user_id": 1, "username": "张三"},
  {"user_id": 2, "username": "李四"},
  {"user_id": 3, "username": "张三"}
]
  • 关联IoT设备数组(设备数组若仅用于验证设备有效性,可在统计时过滤,此处示例直接用关联数组):
[
  {"user_id": 1, "device_id": "iot_001"},
  {"user_id": 1, "device_id": "iot_002"},
  {"user_id": 2, "device_id": "iot_003"},
  {"user_id": 3, "device_id": "iot_004"},
  {"user_id": 3, "device_id": "iot_005"},
  {"user_id": 3, "device_id": "iot_006"}
]

JavaScript实现

// 输入数据
const users = [
  {user_id: 1, username: "张三"},
  {user_id: 2, username: "李四"},
  {user_id: 3, username: "张三"}
];

const deviceRelations = [
  {user_id: 1, device_id: "iot_001"},
  {user_id: 1, device_id: "iot_002"},
  {user_id: 2, device_id: "iot_003"},
  {user_id: 3, device_id: "iot_004"},
  {user_id: 3, device_id: "iot_005"},
  {user_id: 3, device_id: "iot_006"}
];

// 1. 构建用户ID到用户名的映射
const userIdToName = new Map();
users.forEach(user => userIdToName.set(user.user_id, user.username));

// 2. 统计每个用户ID的设备数量
const userIdDeviceCount = new Map();
deviceRelations.forEach(relation => {
  const currentCount = userIdDeviceCount.get(relation.user_id) || 0;
  userIdDeviceCount.set(relation.user_id, currentCount + 1);
});

// 3. 按用户名聚合总数
const usernameTotalCount = new Map();
userIdDeviceCount.forEach((count, userId) => {
  const username = userIdToName.get(userId);
  if (!username) return; // 跳过无对应用户的关联记录
  const total = usernameTotalCount.get(username) || 0;
  usernameTotalCount.set(username, total + count);
});

// 输出结果(转为对象方便查看)
console.log(Object.fromEntries(usernameTotalCount));
// 输出:{ '张三': 5, '李四': 1 }

Python实现

# 输入数据
users = [
    {"user_id": 1, "username": "张三"},
    {"user_id": 2, "username": "李四"},
    {"user_id": 3, "username": "张三"}
]

device_relations = [
    {"user_id": 1, "device_id": "iot_001"},
    {"user_id": 1, "device_id": "iot_002"},
    {"user_id": 2, "device_id": "iot_003"},
    {"user_id": 3, "device_id": "iot_004"},
    {"user_id": 3, "device_id": "iot_005"},
    {"user_id": 3, "device_id": "iot_006"}
]

# 1. 构建用户ID到用户名的映射
user_id_to_name = {user["user_id"]: user["username"] for user in users}

# 2. 统计每个用户ID的设备数量
user_id_device_count = {}
for relation in device_relations:
    user_id = relation["user_id"]
    user_id_device_count[user_id] = user_id_device_count.get(user_id, 0) + 1

# 3. 按用户名聚合总数
username_total_count = {}
for user_id, count in user_id_device_count.items():
    username = user_id_to_name.get(user_id)
    if not username:
        continue
    username_total_count[username] = username_total_count.get(username, 0) + count

# 输出结果
print(username_total_count)
# 输出:{'张三': 5, '李四': 1}

扩展处理(可选)

如果需要显示所有用户(包括无关联设备的用户),只需在聚合步骤前先初始化所有用户名的计数为0:

  • JavaScript扩展:
const usernameTotalCount = new Map();
// 先初始化所有用户的计数为0
users.forEach(user => usernameTotalCount.set(user.username, 0));
// 再累加设备数
userIdDeviceCount.forEach((count, userId) => {
  const username = userIdToName.get(userId);
  if (username) usernameTotalCount.set(username, usernameTotalCount.get(username) + count);
});
  • Python扩展:
username_total_count = {user["username"]: 0 for user in users}
for user_id, count in user_id_device_count.items():
    username = user_id_to_name.get(user_id)
    if username:
        username_total_count[username] += count

内容的提问来源于stack exchange,提问作者Cerr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:40:23