JS按id分组处理数据时如何为每个分组对象添加关联url数组长度属性
实现按id分组并同步统计关联url数量
你当前的分组逻辑已经完成了url按id归集的核心能力,要在遍历流程中直接加入长度统计,只需要调整每个id对应的初始化存储结构,在新增url时同步更新计数即可。
注意:如果直接给数组添加自定义长度属性,执行JSON.stringify写入文件时自定义属性会丢失,因此需要把每个id对应的存储值调整为普通对象,同时存放url列表和长度计数。
整合到原有forEach流程的实现代码
const output = {} sites.forEach(obj=>{ const ids = obj.ids if(ids && ids.length>0){ ids.forEach(id=>{ if(!output[id]){ // 初始化分组结构:包含url列表、关联url计数两个字段 output[id] = { urlList: [], relatedUrlCount: 0 } } output[id].urlList.push(obj.url); // 每新增一个关联url,计数同步+1 output[id].relatedUrlCount += 1; }); } }); fs.writeFileSync('cleanedData.json', JSON.stringify(output, null, 2));
这种写法没有额外遍历开销,计数和url列表的新增完全同步,不会出现计数和实际列表长度不匹配的问题。
最终输出结构示例
执行后写入JSON文件的结构如下:
{ "F20": { "urlList": [ "www.site.com", "www.site.com/something", "www.site.com/somethingelse" ], "relatedUrlCount": 3 }, "C10": { "urlList": [ "www.site.com", "www.site.com/something" ], "relatedUrlCount": 2 }, "C12": { "urlList": [ "www.site.com/somethingelse" ], "relatedUrlCount": 1 }, "C05": { "urlList": [ "www.site.com", "www.site.com/something", "www.site.com/somethingelse" ], "relatedUrlCount": 3 } }
可选简化写法
如果不想在归集过程中维护计数,也可以在所有url归集完成后,统一遍历一次分组对象补充长度字段,代码逻辑更直观,数据量较小时性能差异可以忽略:
const output = {} sites.forEach(obj=>{ const ids = obj.ids if(ids && ids.length>0){ ids.forEach(id=>{ if(!output[id]){ output[id] = { urlList: [] } } output[id].urlList.push(obj.url); }); } }); // 归集完成后统一计算每个分组的url数量 Object.values(output).forEach(group => { group.relatedUrlCount = group.urlList.length }) fs.writeFileSync('cleanedData.json', JSON.stringify(output, null, 2));
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

