Импортируйте массив / объект в файл JSON в определенном месте, чтобы избежать избыточности - PullRequest
0 голосов
/ 15 ноября 2018

В нашем угловом приложении мы имеем текущую ситуацию, когда существующий файл JSON становится все больше и больше с предстоящими задачами, и идея состоит в том, чтобы разбить его на несколько файлов JSON и импортировать их в нужное место, если это необходимо.

Объекты вложены, и идея состоит в том, чтобы разбить последний объект на отдельный файл и импортировать его позже.Как мне этого добиться?Перебирая все вложенные объекты, пока я не найду свою собственность?Общий вопрос, рассматривается ли этот процесс в основном как импорт или слияние?Это хорошая практика, или мы должны переосмыслить процесс, чтобы избежать избыточности?

{
    "name":"a",
    "value1":"b",
    "properties": {
        "name":"aa",
        "value1":"bb",
        "properties": {
            "name":"aaa",
            "value1":"bbb",
            "properties": {
                //import here
}

Я новичок в бизнесе, а также впервые публикую сообщения на stackoverflow, поэтому, пожалуйста, будьте осторожны.

1 Ответ

0 голосов
/ 15 ноября 2018

Это называется сплющиванием, и это довольно распространенная проблема.

Чтобы решить эту проблему, используйте рекурсивную функцию (функцию, которая вызывает себя).

Я дам вам плющилку сверху вниз, не стесняйтесь попробовать начинать снизу самостоятельно!

N.B. : (Это довольно сложный синтаксис, если вы его не понимаете, я могу объяснить вам или упростить его)

const data = {
  id: 1,
  child: {
    id: 2,
    child: {
      id: 3,
      child: {
        id: 4,
        child: {
          id: 5,
        }
      }
    }
  }
};

const flattened = [];

function flatten(item, target) {
  const { child, ...toPush } = item;
  target.push(toPush);
  child && flatten(child, target);
}

flatten(data, flattened);

console.log(flattened);

Затем вы можете сохранить каждый элемент массива. Я предлагаю вам использовать для этого библиотеку, такую ​​как FileSaver , для создания и загрузки файлов.

EDIT

Упрощенно:

const data = {
  id: 1,
  child: {
    id: 2,
    child: {
      id: 3,
      child: {
        id: 4,
        child: {
          id: 5,
        }
      }
    }
  }
};

const flattened = [];

function flatten(item, target) {
  const toPush = { id: item.id };
  const child = item.child;
  target.push(toPush);
  if (child) flatten(child, target);
}

flatten(data, flattened);

console.log(flattened);

Объяснение

  • Вы начинаете с создания функции: эта функция будет принимать элемент и цель в качестве параметров.
  • В функции необходимо добавить элемент в массив и сделать это со всем дочерним деревом.
  • Для этого вы создаете пустой массив и используете .push с элементом минус его дочерний элемент (в моем случае, только идентификатор)
  • После нажатия вам нужно перезапустить эту функцию, но элемент становится дочерним по отношению к предыдущему элементу.
  • Вы защищаете функцию, используя условие, согласно которому она ничего не будет делать, если ребенок не определен.

При этом вы получаете плоский массив, как видно из журнала консоли.

Для «расширенного синтаксиса» я использовал деструктурирующее присвоение и логические операторы, как объяснено здесь

...