0
votes

Additionner uniquement les propriétés numériques de l'objet

J'ai créé une méthode qui renvoie plusieurs mappedObjecst contenant un identifiant et les heures enregistrées quotidiennement.

Voici le code qui renvoie le mappage:

{c94.33:
 [{day: "MON", spent: 28800},
  {day: "WED", spent: 11400},
  {day: "FRI", spent: 19200}],
c.005.001: 
 [{day: "THU", spent: 28800}],
unspecified:
 [{day: "TUE", spent: 28800},
  {day: "WED", spent: 17400},
  {day: "FRI", spent: 9600}]
}

ici sont les mappedObjects retournés:

    return Object.keys(tableData).map(key => {
      const mappedObject = {
        id: key
      };
      tableData[key].forEach(weekday => {
          mappedObject[weekday.day] = Math.round( (weekday.spent / 3600) * 10) / 10;
          this.totalHoursPerid.push(_.sum(_.values(mappedObject)));
          console.log(this.totalHoursPerid);
      });
      return mappedObject;
    });
  }

Comment puis-je créer des sous-sommes des heures sous chaque identifiant?

Par exemple:

c94 .33: 16.5

c.005.001: 8

non spécifié: 15.5

Mon idée et ce que j'ai essayé: -create un tableau et .push dans les valeurs du tableau mappedObject.

{id: "c94.33", MON: 8, WED: 3.2, FRI: 5.3}
{id: "c.005.001", THU: 8}
{id: "unspecified", TUE: 8, WED: 4.8, FRI: 2.7}

cela ne fonctionne pas car la clé id a une valeur de chaîne (du moins c'est ce que je pense). p>

Comme demandé dans les commentaires, c'est la tableData qui est analysée:

 return Object.keys(tableData).map(key => {
      const mappedObject = {
        id: key
      };
      tableData[key].forEach(weekday => {
          mappedObject[weekday.day] = Math.round( (weekday.spent / 3600) * 10) / 10;
      });
      return mappedObject;
    });


4 commentaires

Pouvez-vous également afficher l’entrée d’échantillon d’origine?


Pouvez-vous également afficher les données tableData que vous avez saisies?


ajouté à l'intérieur du message


le champ passé est le temps en secondes et je l'ai converti en heures + minutes


3 Réponses :


2
votes

Vous pouvez utiliser réduire . Extrayez l ' id , puis appliquez Object.values ​​ pour obtenir les valeurs d'autres propriétés.

const tableData = {
    "c94.33": [
        {day: "MON", spent: 28800},
        {day: "WED", spent: 11400},
        {day: "FRI", spent: 19200}
    ],
    "c.005.001": [
        {day: "THU", spent: 28800}
    ],
   "unspecified":[
       {day: "TUE", spent: 28800},
       {day: "WED", spent: 17400},
       {day: "FRI", spent: 9600}
    ]
}

const output = Object.entries(tableData).map(([key, val]) => {
    const sum = val.reduce((accu, {spent}) => {
        accu = accu + Math.round( (spent / 3600) * 10) / 10;
        return accu;
    }, 0)
    return ({[key]: sum})
});

console.log(output);

Vous pouvez également utiliser map,

const input = [
    {id: "c94.33", MON: 8, WED: 3.2, FRI: 5.3}, 
    {id: "c.005.001", THU: 8}, 
    {id: "unspecified", TUE: 8, WED: 4.8, FRI: 2.7}
];

const output = input.map(({id, ...rest}) => ({[id]: Object.values(rest).reduce((accu, val) => accu + val, 0)}));
console.log(output);

const input = [
    {id: "c94.33", MON: 8, WED: 3.2, FRI: 5.3}, 
    {id: "c.005.001", THU: 8}, 
    {id: "unspecified", TUE: 8, WED: 4.8, FRI: 2.7}
];

const output = input.reduce((accu, {id, ...rest}) => {
    accu[id] = Object.values(rest).reduce((accu, val) => accu + val, 0);
    return accu;
}, {});

console.log(output);


4 commentaires

J'ai essayé votre extrait de code et il affiche cette erreur: "La propriété 'réduire' n'existe pas sur le type '{id: string;}'" et ceci: "L'opérateur '+' ne peut pas être appliqué aux types '{}' et '{} '"lorsque vous essayez d'ajouter la valeur (à la deuxième réduction)


le "return mappedObject" dans mon code renvoie un seul objet, pas un tableau d'objets.


Pouvez-vous s'il vous plaît ajouter votre objet? reduction et map fonctionne sur un tableau. Ce serait formidable si vous pouviez ajouter votre objet d'entrée.


voulez-vous dire tableData? Je l'ai ajouté au message



2
votes

let tableData = {"c94.33":
    [{day: "MON", spent: 28800},
     {day: "WED", spent: 11400},
     {day: "FRI", spent: 19200}],
   "c.005.001": 
    [{day: "THU", spent: 28800}],
   "unspecified":
    [{day: "TUE", spent: 28800},
     {day: "WED", spent: 17400},
     {day: "FRI", spent: 9600}]
   }


console.log( Object.keys(tableData).map(key => {
    const mappedObject = {};
      
    var spenttime = 0
    tableData[key].forEach(weekday => {
        spenttime  += Math.round( (weekday.spent / 3600) * 10) / 10;
    });

    mappedObject[key] = spenttime
    return mappedObject;
}));


0 commentaires

1
votes

Vous pouvez tout combiner et calculer les sommes pour les jours lorsque vous créez le nouveau résultat:

const tableData = {"c94.33":[{"day":"MON","spent":28800},{"day":"WED","spent":11400},{"day":"FRI","spent":19200}],"c.005.001":[{"day":"THU","spent":28800}],"unspecified":[{"day":"TUE","spent":28800},{"day":"WED","spent":17400},{"day":"FRI","spent":9600}]};

const calc = spent => Math.round((spent / 3600) * 10) / 10;

// Iterate over the object entries
const out = Object.entries(tableData).reduce((acc, [key, dayArr]) => {

  // `map` over the day array to calculate the spend
  const days = dayArr.map(({ day, spent }) => ({ [day]: calc(spent) }));

  // Use that array to calculate the sum
  const spent = days.reduce((acc, obj) => acc + Object.values(obj)[0], 0);

  // Create and return a new object
  acc[key] = { days, spent };
  return acc;
}, {});

console.log(out);


0 commentaires