1

I have this Object

  var p = 
  [
    { role: 'elite', web: [{ "_id": "55555555ffffff000010200a","name": 'web A' }] },
    { role: 'elite', web: [{ "_id": "55555555ffffff000010200b","name": 'web B' }] },
    { role: 'write', web: [{ "_id": "55555555ffffff000010200c","name": 'web C' }] },
    { role: 'write', web: [{ "_id": "55555555ffffff000010200a","name": 'web A' }] },
    { role: 'view',  web: [{ "_id": "55555555ffffff000010200a","name":  'web A' }] }
  ];

And I Want populate an array if the role is the same.
Like this:

p = 
[
    {   role:'elite',
        web: [{     "_id": "55555555ffffff000010200a",
                    "name": 'web A',
                    "_id": "55555555ffffff000010200b",
                    "name": 'web B'}]
    },
    {   role:'write',
        write: [{   "_id": "55555555ffffff000010200c",
                    "name": 'web C',
                    "_id": "55555555ffffff000010200a",
                    "name": 'web A'}]
    },
    {   role:'view',
        view: [{    "_id": "55555555ffffff000010200a",
                    "name": 'web A'}]
    }
]

I did try with foreach or object methods, but i don't know how can i Check if the Object has a particular role then push or create in web Array inside object

1
  • I fixed the misplaced quote marks, but the OP's goign to have to actually structure the data properly, himself. Commented Apr 11, 2014 at 9:47

2 Answers 2

1

Try with:

var output = {};

for (var k in p) {
  var item = p[k],
      role = item.role;

  if (output[role] == undefined) {
    output[role] = {role: role, web: []};
  }

  output[role].web.push(item.web.pop());
}

output = values(output);

Output:

[
  {
    "role": "elite",
    "web": [
      {"_id": "55555555ffffff000010200a", "name": "web A"},
      {"_id": "55555555ffffff000010200b", "name": "web B"}
    ]
  },
  {
    "role": "write",
    "web": [
      {"_id": "55555555ffffff000010200c", "name": "web C"},
      {"_id": "55555555ffffff000010200a", "name": "web A"}
    ]
  },
  {
    "role": "view",
    "web": [
      {"_id": "55555555ffffff000010200a", "name": "web A"}
    ]
  }
]
Sign up to request clarification or add additional context in comments.

7 Comments

The .push results in nested arrays: "view":[[{"_id":"55555555ffffff000010200a","name":"web A"}]]
@Cerbrus I've missed that. Fixed.
The Final Object is different
Base keys like elite, write, view are required to put data into them. array with data (_id, name) is also required because you cannot have two _id keys in one object.
but i need an Object like kol's answer
|
0
var p = 
    [
        { role: 'elite', web: [{ "_id": "55555555ffffff000010200a","name": 'web A' }] },
        { role: 'elite', web: [{ "_id": "55555555ffffff000010200b","name": 'web B' }] },
        { role: 'write', web: [{ "_id": "55555555ffffff000010200c","name": 'web C' }] },
        { role: 'write', web: [{ "_id": "55555555ffffff000010200a","name": 'web A' }] },
        { role: 'view',  web: [{ "_id": "55555555ffffff000010200a","name": 'web A' }] }
    ],
    q = [], i, j;

for (i = 0; i < p.length; i += 1) {
    j = 0;
    while (j < q.length && p[i].role !== q[j].role) {
        j += 1;
    }
    if (j < q.length) {
        q[j].web.push(p[i].web[0]);
    } else {
        q.push(p[i]);
    }
}
console.log(JSON.stringify(q));

Output:

[
    {"role":"elite","web":[{"_id":"55555555ffffff000010200a","name":"web A"},{"_id":"55555555ffffff000010200b","name":"web B"}]},
    {"role":"write","web":[{"_id":"55555555ffffff000010200c","name":"web C"},{"_id":"55555555ffffff000010200a","name":"web A"}]},
    {"role":"view","web":[{"_id":"55555555ffffff000010200a","name":"web A"}]}
] 

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.