Necesito transformar esta matriz

[ { _id: 'indoor', count: 12 }, { _id: 'outdoor', count: 34 } ]

En este resultado:

{ label: ['in', 'out'], data: [12, 34]}

Por lo tanto, necesito obtener las etiquetas (_id) en una matriz y reemplazarlas con texto individual y necesito obtener los valores como matriz de datos. El orden de ambos debería ser el mismo, por supuesto.

Para la segunda parte, haría algo como

array.map(c => c.count)

Puedo hacer lo mismo con el valor de la etiqueta, pero ¿cómo uso texto individual? P.ej. 'interior' debe reemplazarse por 'automóvil' y 'exterior' debe reemplazarse por 'avión'.

1
user3142695 28 oct. 2019 a las 21:58

6 respuestas

La mejor respuesta

Puede usar el método reduce:

let sourceData = [
    { _id: 'indoor', count: 12 },
    { _id: 'outdoor', count: 34 }
];

const maps = {indoor: 'in', outdoor: 'out'};    

const result = sourceData.reduce((a, c) => {
    a.label = a.label || [];
    a.data = a.data || [];

    a.label.push(maps[c._id]);
    a.data.push(c.count);

    return a;
}, {});

console.log(result);

Puede ordenar su matriz deseada en orden personalizado:

let sourceData = [
    { _id: 'indoor', count: 12 },
    { _id: 'outdoor', count: 34 }
];

const maps = {indoor: 'in', outdoor: 'out'};    

const result = sourceData.reduce((a, c) => {
    a.label = a.label || [];
    a.data = a.data || [];

    a.label.push(maps[c._id]);
    a.data.push(c.count);

    return a;
}, {});

result.label.sort((a, b) => {
  const order = {'out': 1, 'in': 2, undefined: 3};
  return order[a] - order[b];
});

console.log(`custom order of labels: `, result);
1
StepUp 29 oct. 2019 a las 07:24
const data = [ { _id: 'indoor', count: 12 }, { _id: 'outdoor', count: 34 } ];

const indoor = data.filter((item) => item._id === 'indoor').map((i) => i.count);
const outdoor = data.filter((item) => item._id === 'outdoor').map((i) => i.count);

const res = { label: ['in', 'out'], data: [...indoor, ...outdoor]};

console.log(res);

Te daré a continuación:

{
  label: [
    "in",
    "out"
  ],
  data: [
    12,
    34
  ]
}
0
Nenad Borovčanin 28 oct. 2019 a las 19:12

En el mapa, puede volver a llamar el texto y devolver la cadena requerida

let data = [{
  _id: 'indoor',
  count: 12
}, {
  _id: 'outdoor',
  count: 34
}]

let newData = {
  label: data.map((item) => {
    if (item._id === 'indoor') {
      return 'in';
    } else {
      return 'out';
    }

  }),
  data: data.map(item => item.count)

};
console.log(newData)
0
brk 28 oct. 2019 a las 19:06
let labels = {
  indoor: 'car',
  outdoor: 'plaine'
};

let input = [{
  _id: 'indoor',
  count: 12
}, {
  _id: 'outdoor',
  count: 34
}];
let output = input.reduce((output, inObj) => {
  output.label.push(labels[inObj._id]);
  output.data.push(inObj.count);
  return output;
}, {
  label: [],
  data: []
});

console.log(output);
1
junvar 28 oct. 2019 a las 19:05
const data = 
[ 
  { _id: 'indoor', count: 12 }, 
  { _id: 'outdoor', count: 34 } 
]
const result = {
  label: data.map(a => a._id.replace('door','')),
  data: data.map(e => e.count)
}

console.log(result)
1
OlegI 28 oct. 2019 a las 19:16
const arr = [ { _id: 'indoor', count: 12 }, { _id: 'outdoor', count: 34 } ];   
arr.map(o => [o._id === 'indoor' ? 'in' : 'out', o.count])
    .reduce((p, c) => ({
        label: [...p.label, c[0]]),
        data: [...p.data, c[1]])
    }), {
        label: [],
        data: []
    })
0
Federico 28 oct. 2019 a las 19:20
58596859