Normalizr - это способ генерировать идентификаторы для модели сущностей не-идентификаторов? - PullRequest
0 голосов
/ 11 сентября 2018

Я использую normalizr util для обработки ответа API на основе неидентификационной модели. Как я знаю, обычно normalizr работает с моделью идентификаторов, но, возможно, есть какой-то способ генерировать идентификаторы "на ходу"?

Пример ответа моего API:

`` `

// input data:
const inputData = {
  doctors: [
   {
    name: Jon,
    post: chief
   },
   {
    name: Marta,
    post: nurse
   },
   //....
}

// expected output data:
const outputData = {
  entities: {
   nameCards : {
    uniqueID_0: { id: uniqueID_0, name: Jon, post: uniqueID_3 },
    uniqueID_1: { id: uniqueID_1, name: Marta, post: uniqueID_4 }
   },
   positions: {
    uniqueID_3: { id: uniqueID_3, post: chief },
    uniqueID_4: { id: uniqueID_4, post: nurse }
   }
  },
  result: uniqueID_0
}

`` `

P.S. Я слышал от кого-то о генерации идентификаторов «на капоте» в normalizr для таких случаев, как мой, но я нашел такое решение.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Как упоминалось в этом выпуске :

Normalizr никогда не сможет генерировать для вас уникальные идентификаторы.Мы не делаем никаких напоминаний или каких-либо внутренних действий, так как это было бы ненужным для большинства людей.

Ваше рабочее решение в порядке, но не получится, если позже вы снова получите один из этих объектов из другой конечной точки API.

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

И затем, как упомянуто в документации, вам нужноустановить idAttribute для замены 'id' другим ключом:

const data = { id_str: '123', url: 'https://twitter.com', user: { id_str: '456', name: 'Jimmy' } };

const user = new schema.Entity('users', {}, { idAttribute: 'id_str' });
const tweet = new schema.Entity('tweets', { user: user }, { 
    idAttribute: 'id_str',
    // Apply everything from entityB over entityA, except for "favorites"
    mergeStrategy: (entityA, entityB) => ({
      ...entityA,
      ...entityB,
      favorites: entityA.favorites
    }),
    // Remove the URL field from the entity
    processStrategy: (entity) => omit(entity, 'url')
});

const normalizedData = normalize(data, tweet);

РЕДАКТИРОВАТЬ

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

inputData.doctors = inputData.doctors.map((doc, idx) => ({ 
  ...doc, 
  id: `doctor_${idx}`
}))
0 голосов
/ 11 сентября 2018

Иметь processStrategy, которая в основном является функцией, и в этой функции назначить там свои идентификаторы, т.е. value.id = uuid(). Перейдите по ссылке ниже, чтобы увидеть пример https://github.com/paularmstrong/normalizr/issues/256

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...