pixeloftdev
pixeloftdev

Reputation: 247

How to group JSON items every x item

I have some dynamically generated JSON data that I need to group by a specific number. So I have a way to generate the variable for the number, but need to group the items based on that number. This is the original JSON:

"items":[
   {"name":"School","value":"sdf"},
   {"name":"Year","value":"dsf"},
   {"name":"GPA","value":"Sdfdsf"},
   {"name":"School","value":"sdf"},
   {"name":"Year","value":"dsf"},
   {"name":"GPA","value":"Sdfdsf"},
]

I need it to group by every 3 items and format like this:

"items":[
   "item":{
     "School":"sdf",
     "Year":"dsf",
     "GPA":"Sdfdsf"
   },
   "item":{
     "School":"sdf",
     "Year":"dsf",
     "GPA":"Sdfdsf"
   }
]

Here is my current code:

    var newData = "items": [];

    jQuery('.dynamicRow input').each(function() {
        var dName = jQuery(this).closest('input').attr('name');
        var dValue = jQuery(this).closest('input').val();
        var obj = {
            name: dName,
            value: dValue
        };

        newData.items.push(obj);
    });

    jQuery('#debug').text(JSON.stringify(newData));

Upvotes: 1

Views: 36

Answers (1)

Nina Scholz
Nina Scholz

Reputation: 386660

You could use Array#reduce and and insert an new object if i % 3 is zero.

Add the property at the last element of items.

var data = { "items": [{ "name": "School", "value": "sdf" }, { "name": "Year", "value": "dsf" }, { "name": "GPA", "value": "Sdfdsf" }, { "name": "School", "value": "sdf" }, { "name": "Year", "value": "dsf" }, { "name": "GPA", "value": "Sdfdsf" }] },
    result = {
        items: data.items.reduce(function (r, a, i) {
            if (!(i % 3)) {
                r.push({});
            }
            r[r.length - 1][a.name] = a.value;
            return r;
        }, [])
    };

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 2

Related Questions