0
var actual = [
 {"country":"UK","month":"JAN","SR":"John P","AC":"24","PR":"2","TR":1240},
 {"country":"AUSTRIA","month":"JAN","SR":"Brad    P","AC":"64","PR":"12","TR":1700},
 {"country":"ITALY","month":"JAN","SR":"Gim P","AC":"21","PR":"5","TR":900},

 {"country":"UK","month":"FEB","SR":"John P","AC":"14","PR":"4","TR":540},
 {"country":"AUSTRIA","month":"FEB","SR":"Brad P","AC":"24","PR":"12","TR":1700},
 {"country":"ITALY","month":"FEB","SR":"Gim P","AC":"22","PR":"3","TR":600},

 {"country":"UK","month":"MAR","SR":"John P","AC":"56","PR":"2","TR":1440},
 {"country":"AUSTRIA","month":"MAR","SR":"Brad P","AC":"24","PR":"12","TR":700},
 {"country":"ITALY","month":"MAR","SR":"Gim P","AC":"51","PR":"5","TR":200}
 ];

var expect = [
{month:"JAN",val: {"UK":"24","AUSTRIA":"64","ITALY":"21"}},
{month:"FEB",val: {"UK":"14","AUSTRIA":"24","ITALY":"22"}},
{month:"MAR",val: {"UK":"56","AUSTRIA":"24","ITALY":"51"}}
];

I have array of objects which i need to reshape for one other work. need some manipulation which will convert by one function. I have created plunker https://jsbin.com/himawakaju/edit?html,js,console,output

Main factors are Month, Country and its "AC" value.

1
  • and your question is ?... Commented Jul 22, 2015 at 15:07

3 Answers 3

1

Loop through, make an object and than loop through to make your array

var actual = [
 {"country":"UK","month":"JAN","SR":"John P","AC":"24","PR":"2","TR":1240},
 {"country":"AUSTRIA","month":"JAN","SR":"Brad    P","AC":"64","PR":"12","TR":1700},
 {"country":"ITALY","month":"JAN","SR":"Gim P","AC":"21","PR":"5","TR":900},

 {"country":"UK","month":"FEB","SR":"John P","AC":"14","PR":"4","TR":540},
 {"country":"AUSTRIA","month":"FEB","SR":"Brad P","AC":"24","PR":"12","TR":1700},
 {"country":"ITALY","month":"FEB","SR":"Gim P","AC":"22","PR":"3","TR":600},

 {"country":"UK","month":"MAR","SR":"John P","AC":"56","PR":"2","TR":1440},
 {"country":"AUSTRIA","month":"MAR","SR":"Brad P","AC":"24","PR":"12","TR":700},
 {"country":"ITALY","month":"MAR","SR":"Gim P","AC":"51","PR":"5","TR":200}
 ];

var outTemp = {};
actual.forEach(function(obj){ //loop through array
    //see if we saw the month already, if not create it
    if(!outTemp[obj.month]) outTemp[obj.month] = { month : obj.month, val: {} };
    outTemp[obj.month].val[obj.country] = obj.AC;  //add the country with value
});
var expected = [];  //convert the object to the array format that was expected
for (var p in outTemp) {
    expected.push(outTemp[p]);
}
console.log(expected);
Sign up to request clarification or add additional context in comments.

Comments

1

Iterate through array and create new list

var actual = [
 {"country":"UK","month":"JAN","SR":"John P","AC":"24","PR":"2","TR":1240},
 {"country":"AUSTRIA","month":"JAN","SR":"Brad    P","AC":"64","PR":"12","TR":1700},
 {"country":"ITALY","month":"JAN","SR":"Gim P","AC":"21","PR":"5","TR":900},

 {"country":"UK","month":"FEB","SR":"John P","AC":"14","PR":"4","TR":540},
 {"country":"AUSTRIA","month":"FEB","SR":"Brad P","AC":"24","PR":"12","TR":1700},
 {"country":"ITALY","month":"FEB","SR":"Gim P","AC":"22","PR":"3","TR":600},

 {"country":"UK","month":"MAR","SR":"John P","AC":"56","PR":"2","TR":1440},
 {"country":"AUSTRIA","month":"MAR","SR":"Brad P","AC":"24","PR":"12","TR":700},
 {"country":"ITALY","month":"MAR","SR":"Gim P","AC":"51","PR":"5","TR":200}
 ];

var newList =[], val;
for(var i=0; i < actual.length; i+=3){
   val = {};
   val[actual[i].country] = actual[i]["AC"];
  val[actual[i+1].country] = actual[i+1]["AC"];
  val[actual[i+2].country] = actual[i+2]["AC"];
   newList.push({month: actual[i].month, val:val})
}

document.body.innerHTML = JSON.stringify(newList);

1 Comment

The solution is good if the order is always correct and there in no missing months/country for data.
0

This is the correct code... as above solution will help you if there are 3 rows and these will be in same sequnece.

Here is perfect solution :

   var actual = [
                         {"country":"UK","month":"JAN","SR":"John P","AC":"24","PR":"2","TR":1240},
                         {"country":"AUSTRIA","month":"JAN","SR":"Brad    P","AC":"64","PR":"12","TR":1700},
                         {"country":"ITALY","month":"JAN","SR":"Gim P","AC":"21","PR":"5","TR":900},

                         {"country":"UK","month":"FEB","SR":"John P","AC":"14","PR":"4","TR":540},
                         {"country":"AUSTRIA","month":"FEB","SR":"Brad P","AC":"24","PR":"12","TR":1700},
                         {"country":"ITALY","month":"FEB","SR":"Gim P","AC":"22","PR":"3","TR":600},

                         {"country":"UK","month":"MAR","SR":"John P","AC":"56","PR":"2","TR":1440},
                         {"country":"AUSTRIA","month":"MAR","SR":"Brad P","AC":"24","PR":"12","TR":700},
                         {"country":"ITALY","month":"MAR","SR":"Gim P","AC":"51","PR":"5","TR":200}
                    ];
            var tmpArray = [];
            var obj =[];
            for(var k=0; k<actual.length; k++){

                var position = tmpArray.indexOf(actual[k].month);
                if(position == -1){
                    tmpArray.push(actual[k].month);
                    val = {};
                    for(var i=0; i<actual.length; i++){
                        if(actual[i].month == actual[k].month){
                            val[actual[i].country] = actual[i]["AC"];
                        }
                    }
                    obj.push({month: actual[k].month, val:val});
                }


            }

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.