Фильтр Typescript и возврат одного ключа - PullRequest
0 голосов
/ 09 марта 2020

У меня есть набор флажков, которые позволяют пользователю проверять, какие роли назначать новому пользователю. Я могу отфильтровать и получить только те флажки, которые на самом деле отмечены, но у меня возникают проблемы с поиском лучшего способа просто вернуть ключ «name» из этих отмеченных флажков.

userToAdd.roles = this.roles.filter( (role) => role.checked );

Есть ли способ использовать сокращение или просто сказать "role.name" в фильтре, чтобы я не возвращал весь объект? Я могу сделать это с помощью для l oop, но мне любопытно, есть ли лучший способ просто вернуть ключ имени как часть фильтра?

Вот как теперь выглядит объект, который неправильно:

{
  "firstName": "sfsdfds",
  "username": "fdsfsdf",
  "lastName": "sdfsdfsdf",
  "email": "dsfsdfdsf",
  "roles": [
    {
      "ID": "ce97fb46-7e04-4a4f-b393-5a5492b558fb",
      "name": "admin",
      "checked": true
    },
    {
      "ID": "e89bacd2-4140-46a1-9a2b-0f85aa9f9ca0",
      "name": "offline_access",
      "checked": true
    }
  ],
  "password": "pass"
}

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

{
  "firstName": "testing",
  "lastName": "testing",
  "username": "testing",
  "email": "testing",
  "roles": [
    "uma_authorization",
    "offline_access"
  ],
  "password": "pass"
}

Ответы [ 4 ]

3 голосов
/ 09 марта 2020

вы можете отобразить после фильтрации. то есть:

userToAdd.roles = this.roles.filter( (role) => role.checked ).map(role => role.name;
0 голосов
/ 09 марта 2020

Если у вас есть linq, это еще один вариант:

userToAdd.roles = from(this.roles).where(role => role.checked ).select(role =>role.name).toArray();
0 голосов
/ 09 марта 2020

Да, вы можете использовать уменьшить.

    const data = {
      "firstName": "sfsdfds",
      "username": "fdsfsdf",
      "lastName": "sdfsdfsdf",
      "email": "dsfsdfdsf",
      "roles": [
        {
          "ID": "ce97fb46-7e04-4a4f-b393-5a5492b558fb",
          "name": "admin",
          "checked": true
        },
        {
          "ID": "e89bacd2-4140-46a1-9a2b-0f85aa9f9ca0",
          "name": "offline_access",
          "checked": true
        },
        {
          "ID": "e89bacd2-4140-46a1-9a2b-0f85aa9f9ca0",
          "name": "offline_access2",
          "checked": false
        }
      ],
      "password": "pass"
    }


let filtered = data.roles.reduce((acc, curr)=>{
 if(curr.checked) {
   acc.push({
    name: curr.name
   })
 }
 
 return acc;

}, []);

console.log(filtered);

.filter().map() также будет работать, но при сокращении вам не придется дважды перебирать массив.

0 голосов
/ 09 марта 2020

Этого можно добиться, используя метод map() и деструктуризацию объекта , например:

userToAdd.roles = this.roles.filter(({checked}) => checked).map(({name}) => name);

Метод map() создает новый массив, заполненный результаты вызова предоставленной функции для каждого элемента в вызывающем массиве.

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