0

I have the following response array ,I need to convert this object array to json format like the following output, So How can I convert object array to json format using pure javascript.

Below is response

var data1=[{
       vesrion:v1,
       versionData:[{
            date:'2010',
            value:123
         },{
            date:'2011',
            value:135
         },{
            date:'2012',
            value:145
         }]
      },{
       vesrion:v2,
       versionData:[{
            date:'2010',
            value:223
         },{
            date:'2011',
            value:235
         },{
            date:'2012',
            value:245
         }]
      },{
       vesrion:v3,
       versionData:[{
            date:'2010',
            value:323
         },{
            date:'2011',
            value:335
         },{
            date:'2012',
            value:345
         }]
      }]

========================================================================== required object array

[{
  date:'2010',
  data:[{
     version:v1,
     value:123
   },{
     version:v2,
     value:223
   },{
     version:v3,
     value:323
   }]
},{
   date:'2011',
  data:[{
     version:v1,
     value:135
   },{
     version:v2,
     value:235
   },{
     version:v3,
     value:335
   }]
},{
    date:'2012',
  data:[{
     version:v1,
     value:145
   },{
     version:v2,
     value:245
   },{
     version:v3,
     value:345
   }] 
}]

}

1
  • 1
    so you want to sort by dateinstead of versions Commented Aug 28, 2018 at 16:51

4 Answers 4

1

The following code will give you the same result that you want:

function a7(data1) {
 var result = [];
 var aa = {};
 var count = data1.length;
 for (var i = 0; i < count; i++) {
  var versionData = data1[i].versionData;
  if (versionData && versionData.length > 0) {
   for (var j = 0; j < versionData.length; j++) {
    var donotAdd = false;
    result.forEach(function(arrayItem) {
     if (arrayItem.date == versionData[j].date)
      donotAdd = true;
    });
    if (!donotAdd) {
     var bb = {};
     aa["date"] = versionData[j].date;
     aa["data"] = [];
     bb["version"] = data1[i].vesrion;
     bb["value"] = versionData[j].value;
     aa["data"].push(JSON.parse(JSON.stringify(bb)));
     for (var p = i; p < count; p++) {
      for (q = 0; q < data1[p].versionData.length; q++) {
       if (data1[p].versionData[q].date == aa["date"] && data1[i].vesrion != data1[p].vesrion) {
        bb = {};
        bb["version"] = data1[p].vesrion;
        bb["value"] = data1[p].versionData[q].value;
        aa["data"].push(JSON.parse(JSON.stringify(bb)));
        break;
       }
      }
      if (p == count - 1) {
       result.push(JSON.parse(JSON.stringify(aa)));
       aa = {};
      }
     }
    }
   }
  }
 }
 return result;
}
Sign up to request clarification or add additional context in comments.

Comments

0

You can simply Create a map using Array.reduce() (group map by date) and Object.values() on the map will give you the desired result:

let data1=[{ vesrion:"v1", versionData:[{ date:'2010', value:123 },{ date:'2011', value:135 },{ date:'2012', value:145 }] },{ vesrion:"v2", versionData:[{ date:'2010', value:223 },{ date:'2011', value:235 },{ date:'2012', value:245 }] },{ vesrion:"v3", versionData:[{ date:'2010', value:323 },{ date:'2011', value:335 },{ date:'2012', value:345 }] }];
      
let result = Object.values(data1.reduce((a, curr)=>{
   if(curr.versionData && curr.versionData.length){
      curr.versionData.forEach((e)=>{
        a[e.date] = a[e.date] || {"date" : e.date};
        (a[e.date].data = a[e.date].data || []).push({version : curr.vesrion, value : e.value});
      });
   }
   return a;
 },{}));
 
console.log(result);

1 Comment

@Sau_Patil any problem with the solution friend?
0

You can use simple forEach for this and save data date wise in result object and get needed output by using Object.values(result) at the end.

var data = [{ vesrion:"v1", versionData:[{ date:'2010', value:123 },{ date:'2011', value:135 },{ date:'2012', value:145 }] },{ vesrion:"v2", versionData:[{ date:'2010', value:223 },{ date:'2011', value:235 },{ date:'2012', value:245 }] },{ vesrion:"v3", versionData:[{ date:'2010', value:323 },{ date:'2011', value:335 },{ date:'2012', value:345 }] }];

var result = {}

data.forEach(v1 => {
    v1.versionData.forEach(v2 => {
        result[v2.date] = result[v2.date] || {
            date: v2.date,
            data: []
        };

        result[v2.date].data.push({
            vesrion: v1.vesrion,
            value: v2.value
        });
    });
});

result = Object.values(result);

console.log(result);

1 Comment

Thanks @Nishant Dixit
0

A slightly longer answer that is a bit more flexible for a wider array of properties:

var sourceData=[{
    version:'v1',
    versionData:[{
        date:'2010',
        value:123
      },{
        date:'2011',
        value:135
      },{
        date:'2012',
        value:145
      }]
  },{
    version:'v2',
    versionData:[{
        date:'2010',
        value:223
      },{
        date:'2011',
        value:235
      },{
        date:'2012',
        value:245
      }]
  },{
    version:'v3',
    versionData:[{
        date:'2010',
        value:323
      },{
        date:'2011',
        value:335
      },{
        date:'2012',
        value:345
      }]
  }
];

transformData = (sourceData) => {
  const ungrouped = ungroup(sourceData, 'version', 'versionData')
  return groupBy(ungrouped, 'date', 'data')
}

ungroup = (sourceData, groupName, itemsName) => {
  const denormalized = sourceData.map( (item) => {
    group = item[groupName]
    subitems = item[itemsName]
    return subitems.map( (subitem) => ({...subitem, [groupName]: group}) )
  })
  return [].concat(...denormalized)
}

groupBy = (ungrouped, groupName, itemsName) => {
  mapped = ungrouped.reduce( (grouped, item) => {
    group = item[groupName]
    clone = { }
    for( propName in item ) {
      if(item.hasOwnProperty(propName) && propName != groupName )
        clone[propName] = item[propName]
    }
    if( !grouped.hasOwnProperty(group) ) {
      grouped[group]={[groupName]:group,[itemsName]:[]}
    }
    grouped[group][itemsName].push(clone)
    return grouped
  }, {})
  return Object.values(mapped)
}

const transformed = transformData(sourceData)
console.log(transformed)

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.