Rumah  >  Soal Jawab  >  teks badan

Adakah terdapat cara yang lebih pantas untuk meringkaskan nilai utama dalam pelbagai objek?

Saya mempunyai set data yang besar dalam format:

data = [{ a: 12, b: 8 }, { a: 2, c: 4, d: 14 }, { c: 2, e: 4, f: 14 }]

Apa yang saya mahukan ialah objek yang mengandungi jumlah semua kunci (di sini a-f) dan nilainya dalam set data, seperti ini:

{ a: 14, b: 8, c: 6, d: 14, e: 4, f: 14 }

Saya boleh mendapatkan hasil yang diinginkan seperti ini:

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

Masalah saya ialah ini mengambil masa yang lama untuk set data sebenar yang saya ada (yang agak besar). Adakah terdapat cara untuk melakukan ini dengan lebih cekap?

Sesetengah kod di bawah memang mencipta set data palsu yang besar yang menghampiri set data sebenar.

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 hari yang lalu391

membalas semua(1)saya akan balas

  • P粉976488015

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

    Saya akan menggunakan objek pembantu untuk menjejaki jumlah dan gelung melalui objek dalam tatasusunan.

    Perkara yang paling penting ialah hanya melihat setiap nilai sekali untuk memastikan kerumitan rendah (dalam tatatanda O). Terdapat banyak cara untuk mengulang. Saya tidak tahu yang mana lebih pantas, untuk gelung atau .forEach.

    Ini penyelesaian kasar:

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

    balas
    0
  • Batalbalas