J'ai un grand ensemble de données au format :
data = [{ a: 12, b: 8 }, { a: 2, c: 4, d: 14 }, { c: 2, e: 4, f: 14 }]
Ce que je veux, c'est un objet qui contient la somme de toutes les clés (ici a-f) et leurs valeurs dans l'ensemble de données, comme ceci :
{ a: 14, b: 8, c: 6, d: 14, e: 4, f: 14 }
Je peux obtenir le résultat souhaité comme ceci :
function sum(a, b) { return a + b }; function countTotal(n) { let ndata = data.filter((i) => Object.keys(i).includes(n)) let cnt = Object.assign(ndata.map((i) => i[n])).reduce(sum); return {[n]:cnt}; }; let names = 'abcdef'.split('') let res = Array.from(names).map((n) => countTotal(n)) res = Object.assign({}, ...res);
Mon problème est que cela prend beaucoup de temps pour l'ensemble de données dont je dispose (qui est assez volumineux). Existe-t-il un moyen de le faire plus efficacement ?
Certains codes ci-dessous créent un grand ensemble de données factices qui se rapproche de l'ensemble de données réel.
let dummy_names = []; for (let i = 0; i < 2000; i++) { dummy_names.push((Math.random() + 1).toString(36).slice(2,7)); }; dummy_names = [...new Set(dummy_names)]; names = new Set(); function makeResponses() { let responses = {}; let idx = 0; for (let j = 0; j <= Math.floor(Math.random() * 7); j++) { idx = Math.floor(Math.random()*dummy_names.length); inam = dummy_names[idx]; names.add(inam); responses[inam] = Math.floor(Math.random()*20); }; return responses; }; let data = []; for (let i = 0; i < 20000; i++) { data.push(makeResponses()); };
J'utiliserai un objet d'assistance pour garder une trace de la somme et parcourir les objets du tableau.
Le plus important est de ne regarder chaque valeur qu'une seule fois pour maintenir une complexité faible (en notation O). Il existe de nombreuses façons d'itérer. Je ne sais pas laquelle est la plus rapide, la boucle for ou
.forEach
.Voici une solution approximative :