2
votes

Calcul de la valeur correspondante du mois de l'objet Javascript

souhaite obtenir le total de num pour chacun des mois répétés et laisser la valeur des mois uniques telle qu'elle est dans ce tableau d'objets

[
{num: 11000, month: "September"},
{num: 8000, month: "August"},
{num: 5000, month: "jan"},
{num: 6000, month: "feb"}

]

Résultat attendu

[
{num: 5000, month: "September"},
{num: 6000, month: "September"},
{num: 4500, month: "August"},
{num: 3500, month: "August"},
{num: 5000, month: "jan"},
{num: 6000, month: "feb"}

]


0 commentaires

4 Réponses :


2
votes

utilisez reduce.

const input = [
    {num: 5000, month: "September"},
    {num: 6000, month: "September"},
    {num: 4500, month: "August"},
    {num: 3500, month: "August"},
    {num: 5000, month: "jan"},
    {num: 6000, month: "feb"}  
];

const output = Object.values(input.reduce((a, {num, month}) => {
    if(!a[month]) a[month] = {num, month, count: 1};
    else { 
        a[month].num += num;
        a[month].count += 1;
    }
    
    return a;
}, {}));

console.log(output);

--Modifier--

const input = [
    {num: 5000, month: "September"},
    {num: 6000, month: "September"},
    {num: 4500, month: "August"},
    {num: 3500, month: "August"},
    {num: 5000, month: "jan"},
    {num: 6000, month: "feb"}  
];

const output = Object.values(input.reduce((a, {num, month}) => {
    if(!a[month]) a[month] = {num, month};
    else { a[month].num += num;}
    
    return a;
}, {}));

console.log(output);


1 commentaires

est-il possible d'ajouter le numéro d'occurrence également ?? comme [{"num": 11000, "month": "September", count: 2}, {"num": 8000, "month": "August", count: 2}, {"num": 5000, " month ":" jan ", count: 1}, {" num ": 6000," month ":" feb ", count: 1}]



1
votes

Utiliser réduire pour effectuer la réduction initiale, puis la transformer en sa forme d'origine.

Il est possible de combiner cela en une seule, mais cela a été plus facile à comprendre en deux étapes distinctes.

/ p>

const months = [{
    num: 5000,
    month: "September"
  },
  {
    num: 6000,
    month: "September"
  },
  {
    num: 4500,
    month: "August"
  },
  {
    num: 3500,
    month: "August"
  },
  {
    num: 5000,
    month: "jan"
  },
  {
    num: 6000,
    month: "feb"
  }

]

const reduced = months.reduce((result, month) => {

  if (result[month.month]) {
    result[month.month] += month.num
  } else {
    result[month.month] = month.num
  }

  return result;
}, {})

const results = Object.keys(reduced).map(key => ({
  month: key,
  num: reduced[key]
}))

console.log(results)


0 commentaires

1
votes

Vous pouvez réduire le tableau à un objet ayant le mois comme touche et num comme valeur , puis mapper les Object.entries au tableau souhaité:

const arr = [
  { num: 5000, month: "September" },
  { num: 6000, month: "September" },
  { num: 4500, month: "August" },
  { num: 3500, month: "August" },
  { num: 5000, month: "jan" },
  { num: 6000, month: "feb" }
];

const result2 = arr.reduce((acc, curr) => {
  const ndx = acc.findIndex(e => e.month === curr.month);

  if (ndx > -1) {
    acc[ndx].num += curr.num;
  } else {
    acc.push(curr);
  }
  return acc;
}, []);

console.log(result2)

Ou réduisez directement dans le tableau désiré:

const arr = [
  { num: 5000, month: "September" },
  { num: 6000, month: "September" },
  { num: 4500, month: "August" },
  { num: 3500, month: "August" },
  { num: 5000, month: "jan" },
  { num: 6000, month: "feb" }
];

const reduced = arr.reduce((acc, { num, month }) => {
  acc[month] = (acc[month] || 0) + num;
  return acc;
}, {});

const result = Object.entries(reduced).map(([month, num]) => ({ num, month }));

console.log(result);


0 commentaires

1
votes
var container = [
{num: 5000, month: "September"},
{num: 6000, month: "September"},
{num: 4500, month: "August"},
{num: 3500, month: "August"},
{num: 5000, month: "jan"},
{num: 6000, month: "feb"}
];

let result = container.reduce((acc, c) => {
    let index = acc.findIndex((v) => v.month === c.month);
    index > -1 ? acc[index].num += c.num : acc.push(c);
    return acc;
}, []);
console.log(result);
You can use reduce function for this.

0 commentaires