Normalizr: Как нормализовать вложенные ключи и вернуться в прежнюю форму? - PullRequest
0 голосов
/ 04 октября 2018

Это, вероятно, намного понятнее с кодом.Если у меня есть такой ответ.

{
  id: "1",
  container: {
    sections: [
      {
        id: "a",
        pages: [
          {
            id: "z"
          }
        ]
      }
    ]
  }
}

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

{
  // the thing that container is in
  project: {  
    id: "1",
    // maybe remove container key, and know I have to normalize
    // and add the key again?
    container: "?"
  },
  sections: {  
    id: "a": {
      pages: ["z"]
    },
  pages: {
    id: "z"
  }
}

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

РЕДАКТИРОВАТЬ Чтобы немного перефразировать вопрос, я нашел сообщения, подобные этому Normalizr - это способ генерировать идентификаторы для модели сущностей не-идентификаторов? .Они пытаются добавить идентификаторы к вещам, у которых их нет.Я не очень хочу этого, потому что я не хочу нормализовать что-либо на том же уровне или выше container только ниже.

1 Ответ

0 голосов
/ 04 октября 2018

Вы можете включить контейнер как часть определения схемы вашего проекта.

const { schema } = require('normalizr');

const pageSchema = new schema.Entity('pages');

const sectionSchema = new schema.Entity('sections', {
    pages: [pageSchema],
});

const projectSchema = new schema.Entity('projects', {
    container: {
        sections: [sectionSchema],
    },
});

В этом случае контейнер не будет нормализован.Трудно рассматривать их как сущности, если они не обладают какими-либо идентифицирующими свойствами.Если это так, вы можете указать это свойство как idAttribute.

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

Вот как вы денормализуете сущность из нормализованного состояния, используя вышеуказанную схему:

const { normalize, denormalize } = require('normalizr');

const data = {
  id: "1",
  container: {
    sections: [
      {
        id: "a",
        pages: [
          {
            id: "z"
          }
        ]
      }
    ]
  }
};

const state = normalize(data, projectSchema);
// -> {"entities":{"pages":{"z":{"id":"z"}},"sections":{"a":{"id":"a","pages":["z"]}},"projects":{"1":{"id":"1","container":{"sections":["a"]}}}},"result":"1"}    

denormalize(1, projectSchema, state.entities); 
// -> {"id":"1","container":{"sections":[{"id":"a","pages":[{"id":"z"}]}]}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...