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

JS数组对象按value键分组聚合dbid的实现问题求助

问题根因

你编写的分组逻辑本身没有语法错误,无法得到预期结果的核心原因是 NOP_VIEWER.getProperties 是异步回调接口,你在同步执行分组代码时,PropData 还没有完成所有数据的写入操作,自然无法正常分组。同时你原有的分组函数返回的是键值对格式的对象,需要额外做一步格式转换就能匹配你要的输出结构。

完整实现代码

const Selected = "01.04 - Systems";
// 封装异步属性查询为Promise,解决时序问题
const getNodeProp = (nodeId) => {
  return new Promise((resolve) => {
    NOP_VIEWER.getProperties(nodeId, (propRes) => {
      const targetProp = propRes.properties.find(item => Object.values(item).includes(Selected));
      resolve(targetProp ? { value: Object.values(targetProp)[1], dbid: nodeId } : null);
    });
  });
};

// 等待所有节点属性查询完成后再执行分组逻辑
const isolatedNodes = NOP_VIEWER.getIsolatedNodes();
Promise.all(isolatedNodes.map(id => getNodeProp(id))).then(resList => {
  // 过滤无匹配属性的空值
  const validData = resList.filter(Boolean);
  
  // 分组并转换为预期输出格式
  const grouped = Object.entries(
    validData.reduce((acc, item) => {
      acc[item.value] = acc[item.value] || [];
      acc[item.value].push(item.dbid);
      return acc;
    }, {})
  ).map(([value, dbids]) => ({ value, dbids }));

  // 输出最终结果
  console.log(grouped);
});

如果你还是想使用之前自己写的groupBy函数或者lodash的分组方案,只需要把对应的分组逻辑放到Promise.all的回调函数内执行即可,原有分组逻辑不需要修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:45:03