как сопоставить этот массив, если я хочу, чтобы имена групп, перечисленных в разных «вопросов» - PullRequest
0 голосов
/ 30 августа 2018

Как я могу получить имена различных действий в массиве, используя функцию карты в ответе этого типа. Итак, предположим, что в новом массиве activity[] i получит имена всех упомянутых ниже действий. если массив

 const response = [
       {
           "Groups" : {
               "Roles" : {
                   "submission": {
                       "subject" : {
                           "name": "history",
                       }
                   }
               }
           }
       }
   ];

Ответы [ 4 ]

0 голосов
/ 30 августа 2018

Я рекомендую использовать flatMap, поэтому используйте .reduce.

const response = [{
  "Roles": {
    "Permission": {
      "PERMISSION1": {
        "Activity": {
          "name": "Manage Clients",
        }
      },
      "PERMISSION2": {
        "Activity": {
          "name": "Manage Users",
        }
      }
    }
  }
}];

const activityNames = response.reduce(function (acc, res) {
  const permissions = res.Roles.Permission;
  const permissionKeys = Object.keys(permissions);
  const names = permissionKeys.map(function(permissionKey) {
    return permissions[permissionKey].Activity.name;
  });
  acc.push(...names);
  return acc;
}, [])

console.log(activityNames); // ["Manage Clients", "Manage Users"]
0 голосов
/ 30 августа 2018

Сначала вы должны преобразовать Permission объект в массив, потому что у объекта нет метода map.

Тогда вы можете использовать функцию map, где вы можете собрать все имена ваших разрешений для каждого элемента в ответ

const response = [{
  "Roles": {
    "Permission": {
      "PERMISSION1": {
        "Activity": {
          "name": "Manage Clients",
        }
      },
      "PERMISSION2": {
        "Activity": {
          "name": "Manage Users",
        }
      }
    }
  }
}];

response.forEach((item) => {
  item.Activities = Object.values(item.Roles.Permission).map((permission) => permission.Activity.name)
});

alert(JSON.stringify(response));
0 голосов
/ 30 августа 2018

Единственный массив у вас есть ответ. Если у каждого элемента в ответе есть Роли, которые имеют Разрешение, которое имеет несколько ключей с объектами, которые имеют Активность с именем, тогда вы можете сделать следующее:

var response = [
    {
        Roles: {
            Permission: {
                PERMISSION1: {
                    Activity: {
                        name: 'Manage Clients',
                    },
                },
                PERMISSION2: {
                    Activity: {
                        name: 'Manage Users',
                    },
                },
            },
        },
    },
];
console.log(
  response.map(
    (item) => 
      Object.values(item.Roles.Permission)
      .map(
        (permission) => permission.Activity.name
      )
    )  
);
0 голосов
/ 30 августа 2018

Мне удалось сделать это, используя IIFE, но могут быть более чистые способы

при условии, что существует один объект в массиве и нет другого пути к другому разрешению

const response = [
  {
    "Roles" : {
      "Permission" : {
        "PERMISSION1": {
          "Activity" : {
            "name": "Manage Clients",
          }
        },
        "PERMISSION2": {
          "Activity" : {
            "name": "Manage Users",
          }
        }
      }
    }
  }
];

let activities = (() => {
  let res = []
  for (let perm in response[0].Roles.Permission) {
    for (let act in response[0].Roles.Permission[perm]) {
      res.push(response[0].Roles.Permission[perm][act].name)
    }
  } 
  return res})()
  
console.log(activities)
...