javascript конструирование нового объекта с использованием метода Reduce - PullRequest
0 голосов
/ 15 мая 2018

Здравствуйте, я застрял в создании нового объекта на основе ответа бэкэнда.

Вот ответ, который я получил

acl:[
     {
       "user_type":5,
       "user_id":"c7e5cb45ba764ad7ad29b5bdd4f12128",
       "user_name":"John",
       "view":true,
       "modify":false,
       "remove":false,
       "modify_acl":false
     },
     {
       "user_type":5,
       "user_id":"f673beac0245462f8c71066536049e72",
       "user_name":"Allan",
       "view":true,
       "modify":true,
       "remove":true,
       "modify_acl":false
     }]

Требовалось отфильтровать ответ, чтобы удалить все свойства со значением false и создать новый массив, содержащий значение контроля доступа (acl). Ожидаемый новый объект будет выглядеть следующим образом:

[
   { 
   "userType":5,
   "label":"c7e5cb45ba764ad7ad29b5bdd4f12128",
   "value":"John",
   "acl":[
          {"value":"view", "label":"View"}
         ]
   },
   { 
   "userType":5,
   "label":"f673beac0245462f8c71066536049e72",
   "value":"Allan",
   "acl":[
          {"value":"view", "label":"View"},
          {"value":"modify", "label":"Modify"},
          {"value":"remove", "label":"Remove"}
         ]
   }
]

В настоящее время я использую метод Reduce, чтобы удалить все ложные значения. Но я застрял, чтобы построить ожидаемый результат.

1 Ответ

0 голосов
/ 15 мая 2018

Вы можете проверить тип свойства и взять логическое значение для назначения новой пары метка / значение и пропустить ложные значения. В противном случае возьмите пару ключ-значение и назначьте ее фактическому объекту.

Array#map на самом деле лучший метод выбора, потому что он возвращает массив, который требуется.

При использовании Array#reduce аккумулятор никогда не изменится, потому что это будет массив.

var acl = [{ user_type: 5, user_id: "c7e5cb45ba764ad7ad29b5bdd4f12128", user_name: "John", view: true, modify: false, remove: false, modify_acl: false }, { user_type: 5, user_id: "f673beac0245462f8c71066536049e72", user_name: "Allan", view: true, modify: true, remove: true, modify_acl: false }],
    result = acl.map(o => {
        var r = {},
            acl = [];

        Object.entries(o).forEach(([k, v]) => {
            if (typeof v === 'boolean') {
                v && acl.push({ value: k, label: v });
            } else {
                r[k] = v;
            }
        });
        return Object.assign(r, { acl });
    });

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...