Форматтер для объекта JS
Всем привет.
Очень нужна помощь с отступами. Необходимо чтобы при погружении в глубину был определенный отступ от ключа, то есть из входных данных должно получиться необходимые выходные данные, а у меня на данный момент мои выходные данные. Это нужно связать как-то с глубиной, а у меня очень плохо получается делать отступы, потому что вообще не понимаю как это организовать.
Спасибо заранее.
Входные данные:
const obj = [
{
"key": "common",
"value": [
{
"key": "follow",
"value": false,
"type": "added"
},
{
"key": "setting1",
"value1": "Value 1",
"value2": "Value 1",
"type": "nochanged"
},
{
"key": "setting2",
"value": 200,
"type": "deleted"
},
{
"key": "setting3",
"value1": true,
"value2": null,
"type": "changed"
},
{
"key": "setting4",
"value": "blah blah",
"type": "added"
},
{
"key": "setting5",
"value": {
"key5": "value5"
},
"type": "added"
},
{
"key": "setting6",
"value": [
{
"key": "doge",
"value": [
{
"key": "wow",
"value1": "",
"value2": "so much",
"type": "changed"
}
],
"type": "object"
},
{
"key": "key",
"value1": "value",
"value2": "value",
"type": "nochanged"
},
{
"key": "ops",
"value": "vops",
"type": "added"
}
],
"type": "object"
}
],
"type": "object"
},
{
"key": "group1",
"value": [
{
"key": "baz",
"value1": "bas",
"value2": "bars",
"type": "changed"
},
{
"key": "foo",
"value1": "bar",
"value2": "bar",
"type": "nochanged"
},
{
"key": "nest",
"value1": {
"key": "value"
},
"value2": "str",
"type": "changed"
}
],
"type": "object"
},
{
"key": "group2",
"value": {
"abc": 12345,
"deep": {
"id": 45
}
},
"type": "deleted"
},
{
"key": "group3",
"value": {
"deep": {
"id": {
"number": 45
}
},
"fee": 100500
},
"type": "added"
}
];
Необходимые выходные данные:
{
common: {
+ follow: false
setting1: Value 1
- setting2: 200
- setting3: true
+ setting3: null
+ setting4: blah blah
+ setting5: {
key5: value5
}
setting6: {
doge: {
- wow:
+ wow: so much
}
key: value
+ ops: vops
}
}
group1: {
- baz: bas
+ baz: bars
foo: bar
- nest: {
key: value
}
+ nest: str
}
- group2: {
abc: 12345
deep: {
id: 45
}
}
+ group3: {
deep: {
id: {
number: 45
}
}
fee: 100500
}
}
Код:
const stringify = (object, replacer = ' ', countOfReplacer = 1) => {
const iter = (data, acc = 1) => {
const arr = [];
const keys = Object.keys(data);
const numForSize = countOfReplacer * acc;
const innerSize = replacer.repeat(numForSize);
const sizeForBrack = replacer.repeat(numForSize);
const checkData = (data) => {
const arrOfStr = [];
if (typeof data !== 'object' || data === null) {
return data;
} if (typeof data === 'object') {
const keys = Object.keys(data);
keys.forEach((key) => {
if (typeof data[key] !== 'object') {
arrOfStr.push(`${key}: ${data[key]}`);
} if (typeof data[key] === 'object') {
arrOfStr.push(`${key}: ${checkData(data[key])}`);
}
});
}
return [
'{',
...arrOfStr,
`${sizeForBrack}}`,
].join('\n');
};
keys.forEach((key) => {
if (data[key].type === 'object') {
arr.push(`${innerSize}- ${data[key].key}: ${iter(data[key].value, acc + 1)}`);
} if (data[key].type === 'added') {
arr.push(`${innerSize}+ ${data[key].key}: ${checkData(data[key].value)}`);
} if (data[key].type === 'deleted') {
arr.push(`${innerSize}- ${data[key].key}: ${checkData(data[key].value)}`);
} if (data[key].type === 'changed') {
arr.push(`${innerSize}- ${data[key].key}: ${checkData(data[key].value1)}`);
arr.push(`${innerSize}+ ${data[key].key}: ${checkData(data[key].value2)}`);
} if (data[key].type === 'nochanged') {
arr.push(`${innerSize} ${data[key].key}: ${checkData(data[key].value2)}`);
}
});
return [
'{',
...arr,
`${sizeForBrack}}`
].join('\n');
};
return iter(object, 1)
};
Мои выходные данные:
{
- common: {
+ follow: false
setting1: Value 1
- setting2: 200
- setting3: true
+ setting3: null
+ setting4: blah blah
+ setting5: {
key5: value5
}
- setting6: {
- doge: {
- wow:
+ wow: so much
}
key: value
+ ops: vops
}
}
- group1: {
- baz: bas
+ baz: bars
foo: bar
- nest: {
key: value
}
+ nest: str
}
- group2: {
abc: 12345
deep: {
id: 45
}
}
+ group3: {
deep: {
id: {
number: 45
}
}
fee: 100500
}
}
Источник: Stack Overflow на русском