Adakah terdapat cara yang lebih pantas untuk meringkaskan nilai utama dalam pelbagai objek?
P粉191323236
P粉191323236 2024-02-17 17:51:31
0
1
445

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

membalas semua(1)
P粉976488015

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);
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan