如何使用JSON.stringify跳过指定子对象的缩进
我懂你要的效果——让整个JSON结构保持漂亮的缩进格式,但把color子对象压缩成一行紧凑的形式,避免它被拆成多行缩进,对吧?你的思路方向是对的,但现有代码还有两处需要完善的地方,我给你调整一下完整的解决方案:
let obj = { colorsPerValue: [ { value: 0.0, color: { r: 240, g: 59, b: 32 } }, { value: 0.5, color: { r: 255, g: 255, b: 255 } }, { value: 1.0, color: { r: 44, g: 162, b: 95 } } ] }; function replacer(name, val) { // 匹配到color字段时,先把它序列化成紧凑字符串,加个标记方便后续替换 if (name === 'color') { return '__COMPACT_COLOR__' + JSON.stringify(val); } // 其他字段正常返回,保证整体缩进格式(这步很重要,原代码漏掉会导致非color字段被忽略) return val; } // 先生成带全局缩进的JSON let str = JSON.stringify(obj, replacer, 2); // 替换掉标记和多余的引号,把紧凑的color对象还原成JSON结构 str = str.replace(/"__COMPACT_COLOR__({.*?})"/g, '$1'); console.log(str);
为什么要这么处理?
因为JSON.stringify的缩进参数是全局生效的,没法单独指定某个子对象不缩进。我们的思路是:
- 先用replacer给
color字段的值加个特殊标记,同时把它序列化成紧凑的字符串; - 生成全局缩进的JSON后,再用正则把标记和多余的引号去掉,让
color的紧凑对象直接融入JSON结构里。
运行这段代码后,你会得到完全符合需求的输出:
{ "colorsPerValue": [ { "value": 0, "color": {"r":240,"g":59,"b":32} }, { "value": 0.5, "color": {"r":255,"g":255,"b":255} }, { "value": 1, "color": {"r":44,"g":162,"b":95} } ] }
内容的提问来源于stack exchange,提问作者Xavier Peña
相关产品推荐
相关产品推荐

