Форматтер для объекта JS

Рейтинг: 0Ответов: 0Опубликовано: 27.06.2023

Всем привет.
Очень нужна помощь с отступами. Необходимо чтобы при погружении в глубину был определенный отступ от ключа, то есть из входных данных должно получиться необходимые выходные данные, а у меня на данный момент мои выходные данные. Это нужно связать как-то с глубиной, а у меня очень плохо получается делать отступы, потому что вообще не понимаю как это организовать.
Спасибо заранее.

Входные данные:
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
 }
 }

Ответы

Ответов пока нет.