Как привести в порядок мои возвращаемые данные в лучшую модель - PullRequest
0 голосов
/ 03 июня 2019

У меня есть данные API, которые не оптимизированы по своей структуре

Я не могу запросить бэкэнд-разработчиков реструктурировать его, поэтому я собираюсь привести модель в порядок перед использованием в моем приложении Angular 2.

В качестве примера я получаю плоский объект, который содержит таблицы и пользовательские данные

{$id: "400", sqlTable: "Customer", admin: 1, test: 3}

Было бы лучше отфильтровать их и поместить пользователей в подобъект, чтобы ускорить рендеринг без условного тестирования и т. Д.

Предпочтительная структура:

"sqlTable":"value",
"Users":[
  "user1name":permission,
  "user2name":permission
]

Итак, из исходных данных:

  • $ id не важен (поэтому был удален)
  • sqlTable - это имя таблицы
  • Администратор и тест: Пользователи

Таким образом, если мы удалим $ id, «набор правил» - это все, что не является sqlTable, является пользователем и должно быть перемещено в подобъект под названием «Пользователи».

Было бы желательно, если бы кто-нибудь мог привести пример JS / TS о том, как переместить данные (ключ / значение) в подструктуру на основе этого набора правил.

Полный возврат данных в соответствии с запросом:

{  
   "$id":"399",
   "IsFailure":false,
   "IsSuccess":true,
   "Value":[  
      {  
         "$id":"400",
         "sqlTable":"Customer",
         "admin":1,
         "test":null
      },
      {  
         "$id":"401",
         "sqlTable":"CustomerAddress",
         "admin":null,
         "test":null
      },
      {  
         "$id":"402",
         "sqlTable":"NewTable",
         "admin":null,
         "test":null
      }
   ]
}

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

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

const result = data.Value.map(value => ({
      table: value.sqlTable,
      users: Object.entries(value).filter(([key]) => key !== "$id" && key !== "sqlTable")
        .map(([key, value]) => ({
          name: key,
          permissions: value
        }))
    }))

const data = {
  $id: "399",
  IsFailure: false,
  IsSuccess: true,
  Value: [{
      $id: "400",
      sqlTable: "Customer",
      admin: 1,
      test: null
    },
    {
      $id: "401",
      sqlTable: "CustomerAddress",
      admin: null,
      test: null
    },
    {
      $id: "402",
      sqlTable: "NewTable",
      admin: null,
      test: null
    }
  ]
};


const result = data.Value.map(value => ({
  table: value.sqlTable,
  users: Object.entries(value).filter(([key]) => key !== "$id" && key !== "sqlTable")
    .map(([key, value]) => ({
      name: key,
      permissions: value
    }))
}))

console.log(result);
0 голосов
/ 03 июня 2019

Я бы сделал некоторые преобразования данных перед рендерингом, что-то вроде этого:

const data = {
  $id: "399",
  IsFailure: false,
  IsSuccess: true,
  Value: [
    {
      $id: "400",
      sqlTable: "Customer",
      admin: 1,
      test: null
    },
    {
      $id: "401",
      sqlTable: "CustomerAddress",
      admin: null,
      test: null
    },
    {
      $id: "402",
      sqlTable: "NewTable",
      admin: null,
      test: null
    }
  ]
};

//we map every value in "Values"
let result = data.Value.map(table => {
  //first we create our users object, we copy the full object
  let users = { ...table };
  //then we delete extra keys that we do not want
  delete users.sqlTable;
  delete users.$id;
  //then we build the object with the new structure
  return { sqlTable: table.sqlTable, Users: users };
});

console.log(result);
...