Existe-t-il un moyen plus rapide de résumer les valeurs clés dans un large éventail d'objets ?
P粉191323236
P粉191323236 2024-02-17 17:51:31
0
1
373

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粉191323236
P粉191323236

répondre à tous(1)
P粉976488015

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);
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!