-4

How can I convert the below using lodash or javascript :

 [
  {
    "roleId": "1",
    "name": "Superadmin"
    "permissions": [
      {
        "permissionId": "1",
        "action": "Remove"
      }
    ]
  },
  "id": "2",
  "name": "Administrator",
  "permissions": [
    {
      "permissionId": "1",
      "action": "Remove"
    },
    {
      "permissionId": "2",
      "action": "Create"
    },
    {
      "permissionId": "3",
      "action": "Read"
    }
  ]
]

To this:

{
   Superadmin: ['Remove'],
   Administrator: ['Remove', 'Create', 'Read']
}
Alvin
  • 8,219
  • 25
  • 96
  • 177
  • 6
    Have you tried anything that we can help you fix, rather than implementing this specification from scratch for free? – James Thorpe Apr 20 '16 at 12:51
  • 3
    Also your json is not valid.check over that.. – Subburaj Apr 20 '16 at 12:53
  • 1
    This is valid: `[ { "roleId": "1", "name": "Superadmin", "permissions": [ { "permissionId": "1", "action": "Remove" } ] }, { "id": "2", "name": "Administrator", "permissions": [ { "permissionId": "1", "action": "Remove" }, { "permissionId": "2", "action": "Create" }, { "permissionId": "3", "action": "Read" } ] } ]` – mplungjan Apr 20 '16 at 12:56
  • I tried to loop, but any better and faster solutions... – Alvin Apr 20 '16 at 13:03
  • One of these [10000 similar questions](http://stackoverflow.com/search?q=Convert+json+to+array) might help, e.g., [JSON to javaScript array](http://stackoverflow.com/questions/6872832/json-to-javascript-array) – Yogi Apr 20 '16 at 13:05

4 Answers4

3

A proposal with Array#forEach and Array#map.

var array = [{ "roleId": "1", "name": "Superadmin", "permissions": [{ "permissionId": "1", "action": "Remove" }] }, { "id": "2", "name": "Administrator", "permissions": [{ "permissionId": "1", "action": "Remove" }, { "permissionId": "2", "action": "Create" }, { "permissionId": "3", "action": "Read" }] }],
    object = {};

array.forEach(function (a) {
    object[a.name] = a.permissions.map(function (b) {
        return b.action;
    });
});

document.write('<pre>' + JSON.stringify(object, 0, 4) + '</pre>');
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
2

You can use reduce & map

var temp =  [{
    "roleId": "1",
    "name": "Superadmin",
    "permissions": [{
        "permissionId": "1",
        "action": "Remove"
    }]
 }, {
    "id": "2",
    "name": "Administrator",
    "permissions": [{
        "permissionId": "1",
        "action": "Remove"
    }, {
        "permissionId": "2",
        "action": "Create"
    }, {
        "permissionId": "3",
        "action": "Read"
    }]
 }]

temp.reduce((result,obj)=>{
  result[obj.name] = obj.permissions.map(x=>x.action)
  return result;
},{});
Jagdish Idhate
  • 7,513
  • 9
  • 35
  • 51
2

seeing the formatted and valid json from comments, here is something which you can use.

var arr = [{
    "roleId": "1",
    "name": "Superadmin",
    "permissions": [{
        "permissionId": "1",
        "action": "Remove"
    }]
}, {
    "id": "2",
    "name": "Administrator",
    "permissions": [{
        "permissionId": "1",
        "action": "Remove"
    }, {
        "permissionId": "2",
        "action": "Create"
    }, {
        "permissionId": "3",
        "action": "Read"
    }]
}];

var newArray = arr.map(function(obj){ 
  var rObj = {};
  rObj[obj.name] = obj.permissions.map(function(childObj){
     return childObj.action;       
  });
  return rObj;
});

console.log(newArray);

https://jsfiddle.net/daze5a4c/1/

Thalaivar
  • 23,282
  • 5
  • 60
  • 71
2
var json = [{
  "roleId": "1",
  "name": "Superadmin",
  "permissions": [{
    "permissionId": "1",
    "action": "Remove"
  }]
}, {
  "roleId": "2",
  "name": "Administrator",
  "permissions": [{
    "permissionId": "1",
    "action": "Remove"
  }, {
    "permissionId": "2",
    "action": "Create"
  }, {
    "permissionId": "3",
    "action": "Read"
  }]
}];

var roles = {};

json.forEach(function(obj) {
  var actions = [];
  obj.permissions.forEach(function(permission) {
    actions.push(permission.action);
  });
  roles[obj.name] = actions;
});

console.log(roles);

This is exactly how you want it. Just loop through the JSON-objects and get the properties you need to store them in another object (roles).

Output:

{
   Superadmin: ['Remove'],
   Administrator: ['Remove', 'Create', 'Read']
}
Starfish
  • 3,344
  • 1
  • 19
  • 47