2017-08-17 9 views
1

ramdaを使用してオブジェクトの配列を変換するのに役立つ必要があります。私がしたい場合はramdaグループをプロパティで使用し、指定されたプロパティの結果を合計します

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

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

:私は指定されたプロパティ

  • 和で

    1. グループにするために、このような配列を指定して

    を設定し、得られ 上の別のプロパティを希望しますグループによってtitleと合計でageそれは値の次の要約を返す必要があります

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

    不特定のプロパティの値が異なる場合は省略する必要がありますが、指定されていないプロパティの値が同じ場合は最終結果に残す必要があります。

    **マイソリューション**

    /* 
    * [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); 
    
    指定されたプロパティのプロパティとの和の結果によってRAMDAグループを使用して
  • 答えて

    1

    あなたはgroupByが鍵生成機能機能ではなくバイナリ述語を取ることを確認する必要があり、あなたのgroupBy問題を解決するために。

    ので、例えば、

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

    これはあなたの現在のブロックを通してあなたを取得する必要があります。あなたが合計で助けを必要とする場合は、私に教えてください。

    更新

    あなたは私のアプローチを求めました。それはあなたのものとはかなり違っています。

    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) 
    

    または私はそれをもう少し簡潔たい場合、私はに切り替える可能性があります:sumByは比較的再利用可能であることを

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

    注私はおそらくこのような何かをするだろう。それは空リストで失敗するため完璧ではありません。しかし、私たちの場合、groupByの出力は決してそのキー用の空のリストを作成しません。空のリストで失敗しなかったバージョンは、デフォルトのケースを提供する方法が必要です。それは単に醜いです。

    Ramda REPLでこれを確認できます。

    あなたはおそらく、あなたがgroupOnsumOn値で最初に呼び出すことが喜んでいた場合、呼び出しは次のように見えた場合、その後、つまり、値と結果の関数を呼び出すpipecomposeを使用してgroupSumByのより読みやすいバージョンを作ることができますこれは:

    ​​

    しかし、私は読者の練習としてそれを残します。

    +0

    解決策を私の質問に入れましたが、あなたがそれを達成した方法を見ていただければ幸いです –

    0

    一つのオプションis to reduceBy次のように:

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

    出力はtitleでグループ化され、su ageをmmedしました。

    {     
        "scotty": 44,  
        "gabriel": 40  
    }     
    
    関連する問題