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;
});
3 Réponses :
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);
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
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;
}));
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);
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