如何在Node.js/JavaScript中修改JSON不同层级的loc字段值
替换JSON所有层级中指定字段的值
问题描述
需要将JSON对象中所有层级里值为"ar"的loc字段替换为"en",当前代码仅能修改第一层的loc值,无法处理嵌套对象和数组中的对应字段。
原始代码示例:
let sample={ "yuiwedw":{ "id":"yuiwedw", "loc": "ar", "body":{ "data":"we got this", "loc":"ar", "system":{ "fname":"admin", "lname":"admin", "details":[ { "id":"Admin_01", "loc":"ar" }, { "id":"Admin_02", "loc":"ar" } ] } } }, "hbjds324":{ "id":"hbjds324", "loc": "ar", "body":{ "data":"testing", "loc":"ar", "system":{ "fname":"public", "lname":"servent", "details":[ { "id":"public_01", "loc":"ar" } ], "Available":true, "loc":"ar" } } } } for (const value of Object.values(sample)) { value.loc = "en"; } console.log(sample);
解决方案:使用递归遍历所有层级
要处理嵌套的对象和数组,需要编写递归函数遍历每一个元素:
- 若为对象,先检查是否存在
loc字段且值为"ar",是则替换;再递归处理对象的每一个属性值。 - 若为数组,遍历数组内每一个元素,递归处理每个元素。
修改后的代码:
let sample={ "yuiwedw":{ "id":"yuiwedw", "loc": "ar", "body":{ "data":"we got this", "loc":"ar", "system":{ "fname":"admin", "lname":"admin", "details":[ { "id":"Admin_01", "loc":"ar" }, { "id":"Admin_02", "loc":"ar" } ] } } }, "hbjds324":{ "id":"hbjds324", "loc": "ar", "body":{ "data":"testing", "loc":"ar", "system":{ "fname":"public", "lname":"servent", "details":[ { "id":"public_01", "loc":"ar" } ], "Available":true, "loc":"ar" } } } } function replaceLoc(obj) { // 处理对象类型 if (typeof obj === 'object' && obj !== null) { if (obj.loc === 'ar') { obj.loc = 'en'; } // 遍历对象所有属性 for (const key in obj) { if (obj.hasOwnProperty(key)) { replaceLoc(obj[key]); } } } // 处理数组类型 else if (Array.isArray(obj)) { obj.forEach(item => replaceLoc(item)); } } // 调用函数处理整个对象 replaceLoc(sample); console.log(sample);
代码说明
replaceLoc函数会递归遍历传入的对象或数组:- 遇到对象时,先检查并替换当前对象的
loc字段,再递归处理每个属性值。 - 遇到数组时,遍历每一项并递归调用自身处理。
- 遇到对象时,先检查并替换当前对象的
- 这种方式能覆盖所有嵌套层级,确保所有值为
"ar"的loc字段都被替换为"en"。
内容的提问来源于stack exchange,提问作者Arun Yadav
相关产品推荐
相关产品推荐

