Tengo una matriz de objetos y quiero convertirlo de un formato a otro formato para prepararlo para trazarlo en un gráfico d3, quiero que cada clave de objeto que contiene "Spend_" esté en un objeto separado.

La matriz inicial se ve así:

const data = [
  {
    flag: 1,
    name: "Brand 1",
    value: {
      Facebook: 17.76,
      Google: 5.36,
      LinkedIn: 14.32,
      Spend_Facebook: 1658317.72,
      Spend_Google: 500179.417,
      Spend_LinkedIn: 1336724.0,
    },
  },
  {
    flag: 1,
    name: "Brand 2",
    value: {
      Facebook: 13.81,
      Google: 3.22,
      LinkedIn: 12.54,
      Spend_Facebook: 3716170.215,
      Spend_Google: 865968.943,
      Spend_LinkedIn: 3374535.0,
    },
  },
  {
    flag: 1,
    name: "Brand 3",
    value: {
      Facebook: 15.48,
      Google: 5.84,
      LinkedIn: 30.61,
      Spend_Facebook: 2277128.91,
      Spend_Google: 858674.574,
      Spend_LinkedIn: 4502592.0,
    },
  },
];

¿Cómo convertirlo a un formato como este?

const data2 = [
  {
    flag: 1,
    name: "Brand 1",
    Facebook: 17.76,
    Google: 5.36,
    LinkedIn: 14.32,
    type: 1,
  },
  {
    flag: 1,
    name: "Brand 1",
    Spend_Facebook: 1658317.72,
    Spend_Google: 500179.417,
    Spend_LinkedIn: 1336724.0,
    type: 2,
  },
  {
    flag: 1,
    name: "Brand 2",
    Facebook: 13.81,
    Google: 3.22,
    LinkedIn: 12.54,
    type: 1,
  },
  {
    flag: 1,
    name: "Brand 2",
    Spend_Facebook: 3716170.215,
    Spend_Google: 865968.943,
    Spend_LinkedIn: 3374535.0,
    type: 2,
  },
  {
    flag: 1,
    name: "Brand 3",
    Facebook: 15.48,
    Google: 5.84,
    LinkedIn: 30.61,
    type: 1,
  },
  {
    flag: 1,
    name: "Brand 3",
    Spend_Facebook: 2277128.91,
    Spend_Google: 858674.574,
    Spend_LinkedIn: 4502592.0,
    type: 2,
  },
];

Cualquier ayuda para que funcione será apreciada

-2
user14169225 27 ago. 2020 a las 06:04

1 respuesta

La mejor respuesta

Una simple función flatMap debería funcionar.

const data2 = data.flatMap(item => [{
    flag: item.flag,
    name: item.name,
    Facebook: item.value.Facebook,
    Google: item.value.Google,
    LinkedIn: item.value.LinkedIn,
    type: 1
  },{
    flag: item.flag,
    name: item.name,
    Facebook: item.value.Spend_Facebook,
    Google: item.value.Spend_Google,
    LinkedIn: item.value.Spend_LinkedIn,
    type: 2
  }]
);

Si esas claves son dinámicas, puede hacer algo como esto:

const data2 = data.flatMap(item => {
  let type1 = {
    flag: item.flag,
    name: item.name,
    type: 1
  }

  let type2 = {
    flag: item.flag,
    name: item.name,
    type: 2
  }

  for (const key of Object.keys(item.value)){
    if(key.startsWith('Spend_')){
      type2[key.replace('Spend_','')] = item.value[key]
    } else {
      type1[key] = item.value[key]
    }
  }

  return [type1, type2]
});
0
Todd Skelton 27 ago. 2020 a las 04:22