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

JavaScript中对象数组键重命名及非指定字段移除(避免重复循环)

解决方案:一次遍历完成键重命名+字段过滤

你当前的代码需要循环types数组多次调用重命名方法,效率偏低,也没法同步处理字段过滤。可以把逻辑整合到一次遍历里,同时完成指定键重命名和移除非指定字段,完全不需要额外循环。

思路1:生成新对象(不修改原数组,更推荐)

先把types转换成键值映射表,然后遍历原数组的每个对象,只保留types中指定的原键并同步重命名:

// 将types转为快速查找的映射表
const keyMapping = Object.fromEntries(types.map(item => [item.from, item.to]));

// 处理数组:生成只包含目标字段的新数组
const processedAnnotations = annotations.map(obj => {
  const newObj = {};
  // 遍历映射表,只保留需要的字段并改名
  for (const [fromKey, toKey] of Object.entries(keyMapping)) {
    if (obj.hasOwnProperty(fromKey)) {
      newObj[toKey] = obj[fromKey];
    }
  }
  return newObj;
});

思路2:直接修改原对象(和现有代码逻辑对齐)

如果要直接修改原数组里的对象,先收集所有需要保留的键,在一次遍历中完成重命名和多余字段删除:

// 生成键映射表,同时收集所有允许的原键
const keyMapping = Object.fromEntries(types.map(item => [item.from, item.to]));
const allowedTargetKeys = new Set(Object.values(keyMapping));

// 遍历原数组处理每个对象
annotations.forEach(obj => {
  // 先完成指定键的重命名
  for (const [fromKey, toKey] of Object.entries(keyMapping)) {
    if (obj.hasOwnProperty(fromKey)) {
      obj[toKey] = obj[fromKey];
      delete obj[fromKey];
    }
  }
  // 删除所有不在目标键范围内的字段
  for (const key of Object.keys(obj)) {
    if (!allowedTargetKeys.has(key)) {
      delete obj[key];
    }
  }
});

核心优势

  • 两种方案都只遍历annotations数组一次,同步完成所有逻辑,避免重复循环。
  • 用Object.fromEntries把types转为映射表,后续键查找的时间复杂度为O(1),比反复循环types效率更高。

内容的提问来源于stack exchange,提问作者mm1975

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:36:24