JavaScript遍历嵌套JSON:提取内外层数字键的技术咨询
提取JSON多层数字键的解决方案
我最近遇到了一个特殊的JSON结构处理场景,需要提取外层的数字键(比如0、1)以及内层的所有数字键(不需要对应的字符串值)。先来看一下这个JSON结构:
{ "0":{ "-1":"", "0":"VOR_CVR", "1":"VOR_CVR2", "2":"VOR_CVR3", "3":"VOR_CVR4", "4":"VOR_CVR5" }, "1":{ "-1":"", "0":"VOR_RMV", "1":"VOR_FND", "2":"VOR_FND2", "3":"FAGGIO3_MGUARD1", "4":"VOR_FND3", "5":"VOR_FND4" } }
最开始我写了一段代码尝试提取这些键,但发现输出会重复打印外层键(比如外层0会跟着每个内层键打印一次),代码如下:
var string = `{ "0":{ "-1":"", "0":"VOR_CVR", "1":"VOR_CVR2", "2":"VOR_CVR3", "3":"VOR_CVR4", "4":"VOR_CVR5" }, "1":{ "-1":"", "0":"VOR_RMV", "1":"VOR_FND", "2":"VOR_FND2", "3":"FAGGIO3_MGUARD1", "4":"VOR_FND3", "5":"VOR_FND4" } }` var mods = JSON.parse(string); //contains the json string for (var key in mods) { for (var key2 in mods[key]) { console.log(key); console.log(key2); } }
针对这个问题,我整理了两种更贴合需求的解决方案:
方案1:收集所有不重复的外层键和内层键
如果你的需求是把所有外层键和内层键分别收集到数组中(避免重复),可以用这种方式:
const string = `{ "0":{ "-1":"", "0":"VOR_CVR", "1":"VOR_CVR2", "2":"VOR_CVR3", "3":"VOR_CVR4", "4":"VOR_CVR5" }, "1":{ "-1":"", "0":"VOR_RMV", "1":"VOR_FND", "2":"VOR_FND2", "3":"FAGGIO3_MGUARD1", "4":"VOR_FND3", "5":"VOR_FND4" } }`; const mods = JSON.parse(string); const outerKeys = []; const innerKeys = []; for (const key in mods) { outerKeys.push(key); // 遍历内层对象的所有键并收集 for (const key2 in mods[key]) { innerKeys.push(key2); } } console.log("外层键:", outerKeys); // 输出: 外层键: ["0", "1"] console.log("内层键:", innerKeys); // 输出: 内层键: ["-1", "0", "1", "2", "3", "4", "-1", "0", "1", "2", "3", "4", "5"]
如果需要去除内层键的重复值,可以在push前判断是否已存在:
if (!innerKeys.includes(key2)) { innerKeys.push(key2); }
方案2:按层级清晰展示键
如果想要更直观地展示层级关系(外层键只打印一次,随后列出对应的所有内层键),可以用这种写法:
const string = `{ "0":{ "-1":"", "0":"VOR_CVR", "1":"VOR_CVR2", "2":"VOR_CVR3", "3":"VOR_CVR4", "4":"VOR_CVR5" }, "1":{ "-1":"", "0":"VOR_RMV", "1":"VOR_FND", "2":"VOR_FND2", "3":"FAGGIO3_MGUARD1", "4":"VOR_FND3", "5":"VOR_FND4" } }`; const mods = JSON.parse(string); for (const key in mods) { console.log(`外层键: ${key}`); console.log("对应的内层键:"); for (const key2 in mods[key]) { console.log(`- ${key2}`); } console.log("---"); // 分隔不同外层键的内容,更易读 }
这段代码的输出会是:
外层键: 0 对应的内层键: - -1 - 0 - 1 - 2 - 3 - 4 --- 外层键: 1 对应的内层键: - -1 - 0 - 1 - 2 - 3 - 4 - 5 ---
这样就能清晰地看到每个外层键对应的所有内层键,不会出现重复打印外层键的问题。
内容的提问来源于stack exchange,提问作者DarkIce
相关产品推荐
相关产品推荐

