Saya butuh bantuan untuk mengubah array objek menggunakan ramda; aku suka untuk

  1. mengelompokkan berdasarkan properti tertentu
  2. jumlahkan properti lain pada himpunan yang dihasilkan

Diberikan array seperti ini:

var arr = [
  {
    title: "scotty",
    age: 22,
    score: 54,
    hobby: "debugging"

  },  {
    title: "scotty",
    age: 22,
    score: 19,
    hobby: "debugging"
  }
  ,  {
    title: "gabriel",
    age: 40,
    score: 1000
  }
];

Jika saya ingin mengelompokkan berdasarkan title dan menjumlahkan age itu harus mengembalikan ringkasan nilai berikut

var arr = [
  {
    title: "scotty",
    age: 44,
    hobby: "debugging",
  }
  ,  {
    title: "gabriel",
    age: 40,
    score: 1000
  }
];

Ketika properti yang tidak ditentukan nilainya berbeda, mereka harus dihilangkan, tetapi jika properti yang tidak ditentukan nilainya sama, itu harus tetap dalam hasil akhir.

** Solusi Saya **

    /*
 * [Student]
 */
var arr = [
  {
    title: "scotty",
    age: 22,
    score: 54,
    hobby: "debugging"

  },  {
    title: "scotty",
    age: 22,
    score: 19,
    hobby: "debugging"
  }
  ,  {
    title: "gabriel",
    age: 40,
    score: 1000
  }
];


/*
 * String -> [[Student]] -> [Student]
 */
var sumOnProperty = function(property, v){
  var sum = (x,y) => x[property] + y[property];
  var new_array = [];
   v.forEach(arr => {
     if(arr.length > 1){
        arr[0]["age"] = arr.reduce(sum)
        new_array.push(arr[0]);
     } else {
       if(arr.length != 0){
        new_array.push(arr[0]);
       }
     }
   })
  return new_array;
}

/*
 * String -> String -> [Student] -> [Student]
 */
var groupsumBy = function(groupproperty, sumproperty, arr){ 

       // create grouping
       var grouping = R.groupBy(R.prop(groupproperty), arr)

       // convert grouping object to array 
       var result1 = R.valuesIn(grouping);

       // sum each grouping and flatten 2d array
       var result2 = sumOnProperty(sumproperty, result1);

       return result2;
}


groupsumBy("title","age",arr);
7
Jonathan Portorreal 17 Agustus 2017, 18:37

2 jawaban

Jawaban Terbaik

Untuk memperbaiki masalah groupBy Anda, Anda perlu melihat bahwa groupBy membutuhkan kunci -fungsi fungsi generasi dan bukan predikat biner.

Jadi, misalnya,

const byTitle = R.groupBy(R.prop('title'));

Ini akan membuat Anda melewati blok Anda saat ini. Jika Anda memerlukan bantuan dengan penjumlahan, beri tahu saya.

Pembaruan:

Anda meminta pendekatan saya. Itu sedikit berbeda dari milikmu. Saya mungkin akan melakukan sesuatu seperti ini:

const sumBy = prop => vals => reduce(
  (current, val) => evolve({[prop]: add(val[prop])}, current),
  head(vals),
  tail(vals)
)
const groupSumBy = curry((groupOn, sumOn, vals) => 
  values(map(sumBy(sumOn))(groupBy(prop(groupOn), vals)))
)

groupSumBy('title', 'age', people)

Atau jika saya ingin sedikit lebih ringkas, saya mungkin beralih ke:

const sumBy = prop => lift(
  reduce((current, val) => evolve({[prop]: add(val[prop])}, current)
))(head, tail)

Perhatikan bahwa sumBy relatif dapat digunakan kembali. Itu tidak sempurna, karena akan gagal pada daftar kosong. Tetapi dalam kasus kami, kami tahu bahwa output dari groupBy tidak akan pernah membuat daftar kosong untuk sebuah kunci. Dan versi apa pun yang tidak gagal pada daftar kosong akan membutuhkan cara untuk menyediakan kasing default. Itu hanya menjadi jelek.

Anda dapat melihat ini beraksi di REPL Ramda.

Anda mungkin dapat membuat versi groupSumBy yang lebih mudah dibaca menggunakan pipe atau compose jika Anda bersedia menelepon terlebih dahulu dengan groupOn dan sumOn, lalu panggil fungsi yang dihasilkan dengan nilai tersebut, yaitu jika pemanggilannya terlihat seperti ini:

groupSumBy('title', 'age')(people)
// or more likely:
const foo = groupSumBy('title', age)
foo(people)

Tapi saya meninggalkan itu sebagai latihan untuk pembaca.

8
Scott Sauyet 18 Agustus 2017, 16:41

menggunakan grup ramda berdasarkan properti dan menjumlahkan hasil pada properti yang ditentukan

Salah satu opsi adalah reduceBy sebagai berikut:

import * as R from "ramda";

const arr = [
    {
        title: "scotty",
        age: 22,
        score: 54,
        hobby: "debugging"

    }, {
        title: "scotty",
        age: 22,
        score: 19,
        hobby: "debugging"
    }
    , {
        title: "gabriel",
        age: 40,
        score: 1000
    }
];

const reduction =
    R.reduceBy((acc, next) => acc + next.age, 0, (x) => x.title, arr);

console.log(JSON.stringify(reduction, undefined, 2));

Output telah dikelompokkan berdasarkan title dan telah menjumlahkan age.

{                  
  "scotty": 44,    
  "gabriel": 40    
}                  
3
Shaun Luttin 17 Agustus 2017, 16:34