let jsOnObj= { data: { level1: { level2: { level3: { targetKey: 'targetValue' }, targetKey: 'targetValue', level3ContentKey: 'level3value' }, targetkey: 'targetValue', level2ContentKey: 'level2value' }, targetKey: 'targetValue', level1contentKey: 'level1Value' } } function replaceValueInMultiLayerObject(mock, parents) { let helper = (jsonObject, parents) => { for (let [key, value] of Object.entries(jsonObject)) { if (key === 'targetKey') { let path = parents.reduce((all, item) => all + '.' + item, '').slice(1) + '.' + key; console.log('jsonObj.' + path); } if (typeof(value) === 'object') { parents.push(key); helper(value, parents); parents.pop() } } } let res = helper(mock, []); } replaceValueInMultiLayerObject(jsonObj); console.log(jsonObj);
我是这么遍历path的, 拿到的path是string "jsonObj.data.level1.level2.level3.targetKey" "jsonObj.data.level1.level2.targetKey" "jsonObj.data.targetKey"
1 lmqdlr 2022-05-27 00:43:14 +08:00 via Android 非贪婪模式,全局匹配就好了呀。你是要用什么语言,这个示例的话,序列化成 JSON 更简单吧 |
![]() | 2 franklioxygen OP @lmqdlr 我目标是从 json 里面替换掉一个特定 key 的每一个 value ,这个特定 key 可能在很多层里有。用的是 Javascript 。之前写了个递归函数遍历所有节点生成了 path ,不过比较复杂,想着用 regex 可能省几行逻辑 |
![]() | 3 f0rger 2022-05-27 08:54:24 +08:00 via iPhone @franklioxygen 你 mdn 搜一下 JSON.parse ,注意看第二个参数是个 function ,原生 API 就可以满足你的要求 |
![]() | 4 des 2022-05-27 09:14:15 +08:00 via iPhone 你这算邪道路子,json 里面要多几个空格换行什么的,你这不就跑不通了 我看你这举的例子,path 是固定的,那直接记录 path ,按 path 取不好吗? |
5 GuuJiang 2022-05-27 09:38:53 +08:00 via iPhone 用合适的工具去做合适的事,既然是 json 结构,就要用 json 的方式去处理,使用正则表达式属于歪门邪道,会有很多很多的特殊情况,比如 value 里面有个转义过的双引号怎么办,就算你不断地针对每一种特殊情况去打补丁,最后这个正则表达式也会变得复杂无比 |
![]() | 6 franklioxygen OP |