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

如何递归修改任意层级JS Object/JSON中指定键的值?

递归修改任意层级JS对象/JSON中指定键的值

这问题我之前做电商测试的时候天天碰!比如要把所有商品的price批量改成0做模拟数据,递归遍历绝对是最靠谱的方案——毕竟JSON/JS对象的层级完全没规律,必须一层层钻进去找目标键。

核心思路

  1. 写一个递归函数,接收三个参数:待处理的对象/数组、要替换的目标键名、新值
  2. 遍历当前层级的每个元素:
    • 如果是对象:检查每个键,匹配目标键就替换值;如果值是对象/数组,继续递归处理
    • 如果是数组:遍历数组里的每一项,对每一项递归调用函数(毕竟数组里可能嵌套对象或其他数组)
    • 如果是原始值(字符串、数字、布尔、null、undefined):直接跳过,不用处理

完整代码示例

function replaceKeyValues(target, keyToReplace, newValue) {
  // 处理原始值,直接返回(避免递归到非对象/数组的情况)
  if (typeof target !== 'object' || target === null) {
    return target;
  }

  // 处理数组:遍历每个元素递归修改
  if (Array.isArray(target)) {
    return target.map(item => replaceKeyValues(item, keyToReplace, newValue));
  }

  // 处理对象:遍历每个键,这里用展开运算符创建新对象,不修改原对象;如果要改原对象,直接操作target即可
  const updatedObj = { ...target };
  for (const key in updatedObj) {
    if (key === keyToReplace) {
      updatedObj[key] = newValue;
    } else {
      // 对当前键的值递归处理
      updatedObj[key] = replaceKeyValues(updatedObj[key], keyToReplace, newValue);
    }
  }

  return updatedObj;
}

实际使用示例

比如你有这样的嵌套数据:

const originalData = {
  product: "Cotton T-Shirt",
  price: 29.99,
  variants: [
    { size: "XS", price: 27.99 },
    { size: "L", price: 32.99, details: { salePrice: 25.99, price: 32.99 } }
  ],
  relatedProducts: {
    top: { name: "Hoodie", price: 59.99 },
    bottom: { name: "Jeans", price: 49.99 }
  }
};

调用函数把所有price改成0:

const modifiedData = replaceKeyValues(originalData, 'price', 0);
console.log(modifiedData);

输出结果里所有层级的price都会变成0,而且不会修改原对象(因为我们用了{ ...target }创建新对象)。如果想直接修改原对象,把代码里的updatedObj换成直接操作target就行。

注意点

  • 如果你需要处理循环引用的对象(比如对象里有属性指向自己),得加个缓存来记录已经处理过的对象,避免无限递归
  • 函数里用了map和展开运算符,都是ES6+语法,要是要兼容旧环境,换成for循环和Object.assign就行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:16:36