如何为 JSON stringify 应用自定义格式?

How to apply custom formatting for a JSON stringify?

我有以下代码:

const sample = [
  {
    name: "apple",
    points: [ { x: 1, y: 2 }, { x: 3, y: 4 }, { x: 5, y: 6 }, { x: 7, y: 8 } ],
    age: 24
  },
  {
    name: "banana",
    points: [ { x: 1, y: 2 }, { x: 3, y: 4 }, { x: 5, y: 6 }, { x: 7, y: 8 } ],
    age: 45
  }
];

const qwer = JSON.stringify(sample, null, 2);

console.log(qwer);

如果你 运行 它,你会注意到它的格式很好,除了点数组,它非常冗长。

我希望一切都像往常一样缩进(这就是为什么我将 2 作为最后一个参数传递给字符串化),但我希望点数组只占用一行,就像它是这样的在代码中声明。

这是因为目前每个点数组都被拉伸到 18 行,而那时只有 3 或 4 个项目。我希望他们保持在一条线上。

我尝试使用自定义替换器,虽然它有点管用,但它强制 JSON 数组成为一个字符串。但它不是一个字符串。我希望它保持一个数组。

有什么办法吗?

对于一般解决方案,迷你解析器将是最好的方法,但一种快速但 ugly-looking 的方法是使用替换器将数组替换为具有唯一值的字符串化字符串 作为前缀,之后可以替换。

const sample = [
  {
    name: "apple",
    age: 24,
    points: [ { x: 1, y: 2 }, { x: 3, y: 4 }, { x: 5, y: 6 }, { x: 7, y: 8 } ],
  },
  {
    name: "banana",
    age: 45,
    points: [ { x: 1, y: 2 }, { x: 3, y: 4 }, { x: 5, y: 6 }, { x: 7, y: 8 } ],
  }
];

const withNestedStringifiedArrays = JSON.stringify(
  sample,
  (key, value) => key && Array.isArray(value) ? '@@UNIQUE@@' + JSON.stringify(value) : value,
  2
);
const output = withNestedStringifiedArrays.replace(
  /"@@UNIQUE@@(.*?)"(,)?$/gm,
  (_, stringifiedArr, possibleComma = '') => stringifiedArr.replaceAll('\', '') + possibleComma
);
console.log(output);