JavaScript中JSON字符串转对象及属性计数的优化方案问询
解决你的JSON格式修正与计数需求
嘿,我来帮你梳理下这个问题的解决方案~首先得明确:你拿到的原始text变量是语法错误的JSON字符串,这是核心问题——里面的对象没有正确转义双引号,导致标准的JSON.parse没法直接处理。不过我们可以用更靠谱的工具替代手动字符串替换,同时也有库能简化后续的计数逻辑。
一、替代手动字符串替换:用容错JSON解析库
标准JSON.parse对语法要求特别严格,根本没法直接解析这种格式乱掉的字符串,但有不少第三方库专门处理这种“不完美”的JSON:
json5:支持未转义引号(只要不产生歧义)、单引号、末尾逗号这些非标准语法,非常适合你这种场景。安装后这么用:
const JSON5 = require('json5'); const text = '["{"a1":"zxcv","a2":"pqrs","c2":[1,2,3],"a3":{"aa3":"asdfgh","aa5":null}}","{"a1":"xyz","a2":"mno","c2":[103],"a3":{"aa8":"qwerty"}}"]'; // 先处理外层数组元素的多余引号:你的字符串里每个对象被额外双引号包着,得先去掉 const cleanedText = text.replace(/"\{/g, '{').replace(/\}"/g, '}'); const data = JSON5.parse(cleanedText);dirty-json:容错性更强,专门对付各种“脏”JSON,哪怕格式错得更离谱也可能解析成功,用法类似:
const dirtyJSON = require('dirty-json'); const data = dirtyJSON.parse(text);
不过要提一句:这些容错库虽好用,但如果格式错误太严重,还是可能翻车,所以最好尽量从源头拿到格式正确的JSON,省得后续麻烦。
二、简化计数逻辑:用工具库或优化原生写法
如果你不想手动写递归遍历计数,可以用工具库简化,或者优化原生JS的写法:
1. 用Lodash快速统计
Lodash的遍历工具能帮你省不少递归代码,比如这样:
const _ = require('lodash'); function countTargetKeys(data) { const counts = { a1: 0, a2: 0, c2: 0, a3: 0 }; _.forEach(data, item => { // 统计顶层的a1、a2 if (item.a1) counts.a1++; if (item.a2) counts.a2++; // 统计c2的数组元素总数 if (_.isArray(item.c2)) counts.c2 += item.c2.length; // 统计a3的子属性数量 if (_.isPlainObject(item.a3)) counts.a3 += Object.keys(item.a3).length; }); return counts; } const result = countTargetKeys(data); console.log(result); // 输出 { a1: 2, a2: 2, c2: 4, a3: 3 }
2. 纯原生JS优化(不用任何库)
如果不想加依赖,也可以用原生JS的reduce和Object.keys优化你的手动遍历,写得更简洁些:
function countTargetKeys(items) { return items.reduce((acc, item) => { // 统计a1、a2 if ('a1' in item) acc.a1++; if ('a2' in item) acc.a2++; // 统计c2数组元素个数 if (Array.isArray(item.c2)) acc.c2 += item.c2.length; // 统计a3的子属性数量 if (item.a3 && typeof item.a3 === 'object' && !Array.isArray(item.a3)) { acc.a3 += Object.keys(item.a3).length; } return acc; }, { a1: 0, a2: 0, c2: 0, a3: 0 }); }
总结一下
- 没有原生内置函数能直接跳过格式修正解析错误的JSON,要么先修正格式,要么用容错解析库;
- 计数部分可以用Lodash这类工具库减少代码量,也可以用原生JS的方法优化手动遍历;
- 最省心的还是从源头获取格式正确的JSON,这样直接
JSON.parse就能用,省掉格式修正的步骤。
内容的提问来源于stack exchange,提问作者srp321
相关产品推荐
相关产品推荐

