遍历JSON对象时按state字段分组有没有更优的实现方法?
优化实现方案
可以用ES2022原生提供的Object.groupBy方法直接完成分组,再配合排序逻辑,整体代码会精简很多:
// 直接按state分组原始数据 const groupedCities = Object.groupBy(jsonobj.data, item => item.state); // 排序+遍历输出 Object.entries(groupedCities).forEach(([state, cityList]) => { console.log(state); cityList.map(i => i.city).sort().forEach(city => console.log(city)); });
如果需要兼容不支持Object.groupBy的运行环境,也可以简化reduce的写法,省去原实现中多余的浅拷贝、单独map和全量排序步骤:
const groupedCities = jsonobj.data.reduce((acc, { city, state }) => { (acc[state] ??= []).push(city); return acc; }, {}); Object.entries(groupedCities).forEach(([state, cities]) => { console.log(state); cities.sort().forEach(city => console.log(city)); });
相比原实现的优势:
- 减少了不必要的全量数组遍历次数,数据量大时性能更好
- 分组后再针对每个州的城市列表排序,比全量预排序的效率更高
- 用
Object.entries+forEach替代两层for-in循环,避免了for-in意外遍历原型属性的潜在问题 - 用空值合并赋值运算符
??=简化了分组数组的初始化逻辑,代码更简洁易读
内容的提问来源于stack exchange,提问作者simplymarkb
相关产品推荐
相关产品推荐

