JasonDavis
JasonDavis

Reputation: 48933

Pluck items from JSON array into new variables based on a property value in each item?

Based on this JSON array below I need to split it into separate JSON arrays based on the category property on each item.

So all items with the category property set to person will be plucked out and into a new variable holding a new JSON array with just the category items.

I then need to do this for each category found using JavaScript or jQuery.

The sample data below has 3 different category values:

code:

var mock_data_types =  [ 
    {
        "type":"first_name",
        "name":"First Name1",
        "description": "Random generated First Name",
        "example":"Jason",
        "category":"person"
    },
    {
        "type": "last_name",
        "name": "Last Name2",
        "description": "Random generated Last Name",
        "example": "Davis",
        "category": "address"
    },
    {
        "type": "domain",
        "name": "Domain Name3",
        "description": "Random generated WWW Domain Name",
        "example": "google.com",
        "category": "it"
    },
    {
        "type": "Gender",
        "name": "Gender4",
        "description": "Random generated Gender Type",
        "example": "Female",
        "category": "person"
    },
    {
        "type": "first_name",
        "name": "First Name5",
        "description": "Random generated First Name",
        "example": "Jason",
        "category": "person"
    },
    {
        "type": "last_name",
        "name": "Last Name6",
        "description": "Random generated Last Name",
        "example": "Davis",
        "category": "address"
    },
    {
        "type": "domain",
        "name": "Domain Name7",
        "description": "Random generated WWW Domain Name",
        "example": "google.com",
        "category": "person"
    },
    {
        "type": "Gender",
        "name": "Gender8",
        "description": "Random generated Gender Type",
        "example": "Female",
        "category": "address"
    },
    {
        "type": "first_name",
        "name": "First Name9",
        "description": "Random generated First Name",
        "example": "Jason",
        "category": "it"
    },
    {
        "type": "last_name",
        "name": "Last Name10",
        "description": "Random generated Last Name",
        "example": "Davis",
        "category": "person"
    },
    {
        "type": "domain",
        "name": "Domain Name11",
        "description": "Random generated WWW Domain Name",
        "example": "google.com",
        "category": "it"
    },
    {
        "type": "Gender",
        "name": "Gender12",
        "description": "Random generated Gender Type",
        "example": "Female",
        "category": "person"
    },
    {
        "type": "first_name",
        "name": "First Name13",
        "description": "Random generated First Name",
        "example": "Jason",
        "category": "address"
    },
    {
        "type": "last_name",
        "name": "Last Name14",
        "description": "Random generated Last Name",
        "example": "Davis",
        "category": "person"
    },
    {
        "type": "domain",
        "name": "Domain Name15",
        "description": "Random generated WWW Domain Name",
        "example": "google.com",
        "category": "it"
    },
    {
        "type": "Gender",
        "name": "Gender16",
        "description": "Random generated Gender Type",
        "example": "Female",
        "category": "person"
    },
];

Upvotes: 0

Views: 696

Answers (3)

Jon
Jon

Reputation: 2671

If you are not adverse to using a library, I would tell you to get underscore. Using the where function you could do something like below to accomplish your results.

_.where(mock_data_types, {'category': 'person'});

I would also like you can get more complex with the plucking of the data and add as many properties as you like such as:

_.where(mock_data_types, {'category': 'person', 'type': 'first_name'});

Upvotes: 0

Kaushal Niraula
Kaushal Niraula

Reputation: 576

this is a simple javascript solution without using any libraries

var dt = {};
for(var a=0;a<mock_data_types.length;a++) {
    if(dt[mock_data_types[a].category]){
        dt[mock_data_types[a].category].push(mock_data_types[a])
    }else{
        dt[mock_data_types[a].category] = [mock_data_types[a]];
    }

}

Upvotes: 2

Phil
Phil

Reputation: 164796

This is a pretty easy job for Array.prototype.reduce

var mock_data_types =  [{"type":"first_name","name":"First Name1","description":"Random generated First Name","example":"Jason","category":"person"},{"type":"last_name","name":"Last Name2","description":"Random generated Last Name","example":"Davis","category":"address"},{"type":"domain","name":"Domain Name3","description":"Random generated WWW Domain Name","example":"google.com","category":"it"},{"type":"Gender","name":"Gender4","description":"Random generated Gender Type","example":"Female","category":"person"},{"type":"first_name","name":"First Name5","description":"Random generated First Name","example":"Jason","category":"person"},{"type":"last_name","name":"Last Name6","description":"Random generated Last Name","example":"Davis","category":"address"},{"type":"domain","name":"Domain Name7","description":"Random generated WWW Domain Name","example":"google.com","category":"person"},{"type":"Gender","name":"Gender8","description":"Random generated Gender Type","example":"Female","category":"address"},{"type":"first_name","name":"First Name9","description":"Random generated First Name","example":"Jason","category":"it"},{"type":"last_name","name":"Last Name10","description":"Random generated Last Name","example":"Davis","category":"person"},{"type":"domain","name":"Domain Name11","description":"Random generated WWW Domain Name","example":"google.com","category":"it"},{"type":"Gender","name":"Gender12","description":"Random generated Gender Type","example":"Female","category":"person"},{"type":"first_name","name":"First Name13","description":"Random generated First Name","example":"Jason","category":"address"},{"type":"last_name","name":"Last Name14","description":"Random generated Last Name","example":"Davis","category":"person"},{"type":"domain","name":"Domain Name15","description":"Random generated WWW Domain Name","example":"google.com","category":"it"},{"type":"Gender","name":"Gender16","description":"Random generated Gender Type","example":"Female","category":"person"}];

var categories = mock_data_types.reduce((categories, dataType) => {
    categories[dataType.category] = categories[dataType.category] || [];
    categories[dataType.category].push(dataType);
    return categories;
}, {});

document.write('<pre>' + JSON.stringify(categories, null, '  ') + '</pre>');

Upvotes: 2

Related Questions