Maison  >  Questions et réponses  >  le corps du texte

Existe-t-il un moyen plus rapide de résumer les valeurs clés dans un large éventail d'objets ?

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());
    };

P粉191323236P粉191323236245 Il y a quelques jours385

répondre à tous(1)je répondrai

  • P粉976488015

    P粉9764880152024-02-18 15:15:02

    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 :

        const data = [{a: 12, b: 8}, {a: 2, c: 4, d: 14}, {c: 2, e: 4, f: 14}];
        const sums = {};
        data.forEach(object => {
            Object.entries(object).forEach(([key, value]) => {
                if (sums.hasOwnProperty(key)) {
                    sums[key] += value;
                } else {
                    sums[key] = value;
                }
            });
        });
        console.log(sums);

    répondre
    0
  • Annulerrépondre