cari

Rumah  >  Soal Jawab  >  teks badan

Cara terbaik untuk mengumpulkan pelbagai objek

Apakah cara paling berkesan untuk mengumpulkan objek dalam tatasusunan?

Sebagai contoh, diberikan pelbagai objek ini:

[ 
    { Phase: "Phase 1", Step: "Step 1", Task: "Task 1", Value: "5" },
    { Phase: "Phase 1", Step: "Step 1", Task: "Task 2", Value: "10" },
    { Phase: "Phase 1", Step: "Step 2", Task: "Task 1", Value: "15" },
    { Phase: "Phase 1", Step: "Step 2", Task: "Task 2", Value: "20" },
    { Phase: "Phase 2", Step: "Step 1", Task: "Task 1", Value: "25" },
    { Phase: "Phase 2", Step: "Step 1", Task: "Task 2", Value: "30" },
    { Phase: "Phase 2", Step: "Step 2", Task: "Task 1", Value: "35" },
    { Phase: "Phase 2", Step: "Step 2", Task: "Task 2", Value: "40" }
]

Saya memaparkan maklumat ini dalam jadual. Saya ingin mengumpulkan mengikut kaedah yang berbeza tetapi saya ingin menjumlahkan nilainya.

Saya menggunakan Underscore.js untuk fungsi groupbynya, yang banyak membantu, tetapi tidak menyelesaikan keseluruhan masalah kerana saya tidak mahu mereka "berpecah" tetapi "bercantum", lebih seperti pendekatan SQL group by.

Saya ingin dapat mengira jumlah nilai tertentu jika perlu.

Jadi jika saya buat groupby Phase Saya menjangkakan untuk menerima:

[
    { Phase: "Phase 1", Value: 50 },
    { Phase: "Phase 2", Value: 130 }
]

Jika saya melaksanakan kumpulan Phase / Step / Langkah, saya menerima:

[
    { Phase: "Phase 1", Step: "Step 1", Value: 15 },
    { Phase: "Phase 1", Step: "Step 2", Value: 35 },
    { Phase: "Phase 2", Step: "Step 1", Value: 55 },
    { Phase: "Phase 2", Step: "Step 2", Value: 75 }
]

Adakah terdapat skrip yang berguna atau perlukah saya menggunakan Underscore.js dan gelung melalui objek hasil untuk mengira jumlah itu sendiri?

P粉348915572P粉348915572459 hari yang lalu632

membalas semua(2)saya akan balas

  • P粉933003350

    P粉9330033502023-10-10 22:01:48

    Gunakan objek Peta ES6:

    /**
     * @description
     * Takes an Array, and a grouping function,
     * and returns a Map of the array grouped by the grouping function.
     *
     * @param list An array of type V.
     * @param keyGetter A Function that takes the the Array type V as an input, and returns a value of type K.
     *                  K is generally intended to be a property key of V.
     *
     * @returns Map of the array grouped by the grouping function.
     */
    //export function groupBy(list: Array, keyGetter: (input: V) => K): Map> {
    //    const map = new Map>();
    function groupBy(list, keyGetter) {
        const map = new Map();
        list.forEach((item) => {
             const key = keyGetter(item);
             const collection = map.get(key);
             if (!collection) {
                 map.set(key, [item]);
             } else {
                 collection.push(item);
             }
        });
        return map;
    }
    
    
    // example usage
    
    const pets = [
        {type:"Dog", name:"Spot"},
        {type:"Cat", name:"Tiger"},
        {type:"Dog", name:"Rover"}, 
        {type:"Cat", name:"Leo"}
    ];
        
    const grouped = groupBy(pets, pet => pet.type);
        
    console.log(grouped.get("Dog")); // -> [{type:"Dog", name:"Spot"}, {type:"Dog", name:"Rover"}]
    console.log(grouped.get("Cat")); // -> [{type:"Cat", name:"Tiger"}, {type:"Cat", name:"Leo"}]
    
    const odd = Symbol();
    const even = Symbol();
    const numbers = [1,2,3,4,5,6,7];
    
    const oddEven = groupBy(numbers, x => (x % 2 === 1 ? odd : even));
        
    console.log(oddEven.get(odd)); // -> [1,3,5,7]
    console.log(oddEven.get(even)); // -> [2,4,6]

    Mengenai peta: https://developer.mozilla.org/en-US /docs/Web/JavaScript/Reference/Global_Objects/Map

    balas
    0
  • P粉681400307

    P粉6814003072023-10-10 09:27:55

    Jika anda ingin mengelak daripada menggunakan perpustakaan luaran, anda boleh melaksanakan versi biasa groupBy() seperti ini:

    var groupBy = function(xs, key) {
      return xs.reduce(function(rv, x) {
        (rv[x[key]] = rv[x[key]] || []).push(x);
        return rv;
      }, {});
    };
    
    console.log(groupBy(['one', 'two', 'three'], 'length'));
    
    // => {"3": ["one", "two"], "5": ["three"]}

    balas
    0
  • Batalbalas