Дублировать объект JS с использованием ванильного javascript

У меня есть следующий массив ответов. Мне нужно преобразовать этот массив объектов в формат json, как показано ниже. Итак, как я могу преобразовать массив объектов в формат json, используя чистый javascript.

Ниже ответ

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
         }]
      }]

================================================== ======================== требуемый массив объектов

[{
  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
   }] 
}]

}


89
4

Ответы:

Решено

Вы можете просто создать карту, используя Array.reduce () (группировать карту по дате), и Object.values() на карте даст вам желаемый результат:

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);

Вы можете использовать для этого простой forEach и сохранить данные по дате в resultobject и получить необходимый вывод, используя Object.values(result) в конце.

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);

Немного более длинный ответ, более гибкий для более широкого набора свойств:

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)

Следующий код даст вам тот же результат, который вы хотите:

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;
}