2016-07-12 16 views
1

罰金に私は「ルル」からすべての名前「デュバル」を区別することができるだろうので、私は、名前でこのオブジェクトグループにしようとしている:一般的なグループ化

const groupName = R.groupBy(R.prop('name'), [data]); 

しかし、これはしません作業する:

let data = { 
    benj: { 
     content : undefined, 
     name : 'duval', 
     complete: false, 
     height : 181 
    }, 

    joy: { 
     content : undefined, 
     name : 'duval', 
     complete: true 
    }, 


    kaori: { 
     content : undefined, 
     name : 'lulu', 
     complete: true 
    }, 

    satomi: { 
     content : undefined, 
     name : 'lulu', 
     complete: true 
    } 
} 

オブジェクトの形式を変更する必要がありますか、このようなオブジェクトで行う方法はありますか?

答えて

2

[data]からgroupByに合格することはあまり役に立ちません。 1つのアイテムを含むリストをグループ化するとします。そのアイテムが '名前'ではなく 'bennj'や 'joy'のようなプロパティを持つという事実は、この問題の一部にすぎません。

あなたは、この出力は有用であろうと、私は考えて、動作する何かを得ることができます。

{ 
    duval: { 
    benj: { 
     content: undefined, 
     name: "duval", 
     complete: false, 
     height: 181 
    }, 
    joy: { 
     content: undefined, 
     name: "duval", 
     complete: true 
    } 
    }, 
    lulu: { 
    kaori: { 
     content: undefined, 
     name: "lulu", 
     complete: true 
    }, 
    satomi: { 
     content: undefined, 
     name: "lulu", 
     complete: true 
    } 
    } 
} 

をしかし、それは少しより複雑です:

compose(map(fromPairs), groupBy(path([1, 'name'])), toPairs)(data) 

toPairsは、リストにデータを変換し、

[ 
    "benj", 
    { 
    complete: false, 
    content: undefined, 
    height: 181, 
    name: "duval" 
    } 
] 

次にgroupBy(path[1, 'name'])は、このリストのインデックス1にあるオブジェクトの名前を検索することで、探しているグループ化を行います。

最後にmap(fromPairs)はリストのこれらのリストをオブジェクトに戻します。

これは特に優れた解決策ではありませんが、実際にはリストではないものに対してリスト処理を行う場合は、かなり一般的です。

+0

入力するととても簡単です。ありがとう、非常にうまく動作します。特定のレベルをターゲットにするのではなく、パスとして「any」を指定したかったのですが、再帰なしで行う方法はありますか? –

+0

私は再帰なしでそれを行う方法は考えられません。他の人が考えているかもしれません。 –

+0

あなたの出力がどのように表示されるかという疑問も生じます。これらの任意のネストされたオブジェクトをどのようにグループ化しますか? –

関連する問題