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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:04:53