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
相关产品推荐
相关产品推荐

