JSON文件中筛选值并修改指定索引对应值的更优实现方法
更高效的实现方案
你的代码功能没问题,但在数据量较大时可以进一步优化——原方案每次循环都会创建新数组,且includes是线性查找(时间复杂度O(n)),重复执行会带来额外性能开销。更高效的方式是用映射表(对象或Map)来存储索引与目标属性值的对应关系,这样查找操作是常数时间O(1),且只需初始化一次映射表。
优化后的代码
方案1:使用普通对象(最简洁)
// 先定义索引到属性值的映射 const indexToProperty = { 1: property1, 4: property1, 2: property2, 9: property2, 22: property2 }; jsonFile.items.forEach((item) => { // 直接通过索引取值,存在则赋值 if (indexToProperty.hasOwnProperty(item.index)) { item.property = indexToProperty[item.index]; } });
方案2:使用Map(适合非字符串类型的索引)
如果你的item.index可能是数字以外的类型,用Map更稳妥:
const indexMap = new Map([ [1, property1], [4, property1], [2, property2], [9, property2], [22, property2] ]); jsonFile.items.forEach((item) => { if (indexMap.has(item.index)) { item.property = indexMap.get(item.index); } });
优化点说明
- 性能提升:映射表的查找是O(1),相比原方案每次
includes的O(k)(k是数组长度),数据量越大优势越明显。 - 可维护性:新增/修改索引对应的属性值时,只需修改映射表,不用改动循环内的条件判断,扩展性更好。
- 减少冗余:避免了每次循环创建新数组的内存开销。
如果大部分item都需要更新属性,还可以省略if判断直接赋值(不存在的索引会保留原属性,需业务允许):
jsonFile.items.forEach((item) => { item.property = indexToProperty[item.index] ?? item.property; });
这里用??空值合并运算符,确保只有当映射表中有对应值时才更新,否则保留原属性。
内容的提问来源于stack exchange,提问作者Mag
相关产品推荐
相关产品推荐

