J'ai parcouru le débordement de la pile et je me sens comme une solution beaucoup plus facile en utilisant la carte et réduisez pour résoudre ce problème, mais c'est ma façon maladroite de le résoudre jusqu'à présent. J'ai besoin de résumer des données par des dates sans avoir une "clé" dans l'objet JSON d'origine. Voir ci-dessous pour l'extrait de code et le résultat qui semble fonctionner. J'apprécierais toute idée de le faire mieux. Merci.
p>
// input var array1 = [{'2019-07-13': 1, '2019-07-14': 4, '2019-07-15': 7}]; var array2 = [{'2019-07-13': 5, '2019-07-14': 8, '2019-07-15': 6}]; var array3 = [{'2019-07-13': 2, '2019-07-14': 1, '2019-07-15': 9}]; // output should look like this // [{2019-07-13: 8, 2019-07-14: 13, 2019-07-15: 22}] var combinedArray = []; var finalArraySum = []; // combine all the arrays into one... var arrays = array1.concat(array2, array3); arrays.forEach((array, index) => { Object.keys(array).forEach(function(key) { var element = [key, array[key]]; combinedArray.push(element); }) }); // loop through the combined arrays combinedArray.forEach((item, index) => { // figure out if the item already exists in the final summed up array var sumExists = finalArraySum.filter((innerItem, index) => { return innerItem[0] === item[0]; }); // if not exists, then push the initial one if(sumExists.length === 0) { finalArraySum.push([item[0], item[1]]); } else { // else add up to the already existing one sumExists[0][1] = item[1] + sumExists[0][1]; } }) console.log(finalArraySum); var finalObject = []; var stringObject = '{'; finalArraySum.forEach((item, index) => { console.log(item); stringObject = stringObject + '"' + item[0] + '":"' + item[1] + '",'; }); stringObject = stringObject.substr(0, stringObject.length - 1) + "}"; console.log(JSON.parse(stringObject)); finalObject.push(JSON.parse(stringObject)); console.log(finalObject);
3 Réponses :
comme @Hereticmonkey Notes, cette question est probablement mieux adaptée au évaluation de code , car Stackoverflow est généralement pour obtenir de l'aide de la résolution de l'aide. problèmes plutôt que de discuter de la qualité du code fonctionnel. Il suffit de garder cela à l'esprit pour la prochaine fois.
qui étant dit, oui, il est possible d'utiliser p> tableau # réduire code> ici, mais ce n'est pas le moyen le plus simple. Deux boucles et certains destructurants sont tout ce dont vous avez besoin. P>
var array1 = [{'2019-07-13': 1, '2019-07-14': 4, '2019-07-15': 7}];
var array2 = [{'2019-07-13': 5, '2019-07-14': 8, '2019-07-15': 6}];
var array3 = [{'2019-07-13': 2, '2019-07-14': 1, '2019-07-15': 9}];
let mergedInput = [...array1, ...array2, ...array3];
let temp = {};
for (a of mergedInput) {
for (const [k, v] of Object.entries(a)) {
temp[k] = (temp[k]||0)+a[k];
}
}
console.log(temp);
Cliquez sur <> code> dans l'éditeur d'éditeur peut l'exécuter ici dans la pile extrait sans avoir à aller ailleurs
@charlietfl d'accord, wow. Je ne savais pas qu'il y avait même une interface graphique pour les extraits de pile. Je serai certainement appuyé vers cela à partir de maintenant!
"Pas le moyen le plus simple" est mon opinion personnelle de la plupart des utilisations de réduire code> que je vois.
Vous pouvez accomplir ceci en utilisant p> array.pototype.reduce code> -
const concat = (a = {}, b = {}) =>
Object
.entries(b)
.reduce
( (r, [ k, v ]) =>
({ ...r, [k]: (r[k] || 0) + v })
, a
)
const main = (...all) =>
all.reduce(concat, {})
var array1 =
[{'2019-07-13': 1, '2019-07-14': 4, '2019-07-15': 7}]
var array2 =
[{'2019-07-13': 5, '2019-07-14': 8, '2019-07-15': 6}]
var array3 =
[{'2019-07-13': 2, '2019-07-14': 1, '2019-07-15': 9}]
console.log(main(...array1, ...array2, ...array3))
// { '2019-07-13': 8
// , '2019-07-14': 13
// , '2019-07-15': 22
// }
Vous pouvez combiner tous les objets dans le tableau unique et le réduire comme suit:
p>
const array1 = [{'2019-07-13': 1, '2019-07-14': 4, '2019-07-15': 7}]; const array2 = [{'2019-07-13': 5, '2019-07-14': 8, '2019-07-15': 6}]; const array3 = [{'2019-07-13': 2, '2019-07-14': 1, '2019-07-15': 9}]; const all = [...array1, ...array2, ...array3]; const sumtotal = Object.keys(array1[0]).reduce((acc, key) => { return { ...acc, [key]: all.reduce((acc, arr) => acc + arr[key], 0) }; }, {}); console.log(sumtotal);
Pourquoi vos variables d'entrée utilisent-elles des objets enveloppés dans des tableaux d'une longueur?
Si le code est votre propre, cela fonctionne et vous recherchez une critique complète du code, évaluation de code pourrait être un meilleur match pour cette question. Je vous encourage fortement à lire leur centre d'aide avant de demander cependant.
Vous pouvez également jeter un coup d'œil aux réponses à Somme des valeurs de propriété d'objet Array dans une nouvelle gamme d'objets dans JavaScript .
Merci beaucoup pour les commentaires et les réponses. Je garderai à l'esprit l'examen du code, que je n'étais pas au courant. @Ironflare, la raison pour laquelle les intrants sont formatés de cette façon est simplement la façon dont je reçois les données d'une API que je n'ai pas de contrôle ...