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