Tengo el siguiente código:
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);Si lo ejecuta, notará que tiene un buen formato, excepto por la matriz de puntos, que es extremadamente detallada.
Me gustaría que todo tuviera una sangría normal (es por eso que estoy pasando 2 para que el parámetro final se encadene), pero me gustaría que la matriz de puntos solo tome una sola línea, como se declara en el código.
La razón de esto es que actualmente cada matriz de puntos se extiende a 18 líneas, cuando solo habrá 3 o 4 elementos. Me gustaría que se quedaran en una línea.
Traté de usar un sustituto personalizado y, aunque funcionó, obligó a que la matriz JSON fuera una cadena. Pero no es una cadena. Quiero que siga siendo una matriz.
¿Hay alguna manera de hacer esto?
Para la solución general, un mini analizador sería el mejor enfoque, pero un enfoque rápido pero feo sería usar un sustituto para reemplazar las matrices con cadenas en forma de cadena con un valor único como prefijo que se puede reemplazar después.
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);