2016-12-07 12 views
0

私は、このようなこの1オブジェクトのリストを持っている:重複したオブジェクト

var original = [ 
    { 
    prop1: 1, 
    prop2: 2, 
    tags: ["tag1", "tag2"] 
    }, 
    { 
    prop1: 3, 
    prop2: 4, 
    tags: ["tag1", "tag3", "tag4"] 
    }, 
    { 
    prop1: 5, 
    prop2: 6, 
    tags: ["tag4"] 
    } 
] 

私は最終的にすべてのタグに1つのオブジェクト(も重複したもの)を持つために、タグに基づいてオブジェクトを複製しますramda.jsを使用します。

var parsed = [ 
    { 
    prop1: 1, 
    prop2: 2, 
    tags: ["tag1"] 
    }, 
    { 
    prop1: 1, 
    prop2: 2, 
    tags: ["tag2"] 
    }, 
    { 
    prop1: 3, 
    prop2: 4, 
    tags: ["tag1"] 
    }, 
    { 
    prop1: 3, 
    prop2: 4, 
    tags: ["tag3"] 
    }, 
    { 
    prop1: 3, 
    prop2: 4, 
    tags: ["tag4"] 
    }, 
    { 
    prop1: 5, 
    prop2: 6, 
    tags: ["tag4"] 
    } 
] 

私はこの機能を試してみましたが、私はいくつかのよりよい解決策

var f = (a,b) => R.evolve({tags:() => a}, b) 
R.unnest(
    R.map((v) => 
    R.zipWith(f, v.tags, R.repeat(v, v.tags.length)) 
)(original) 
) 

答えて

2

あなたはこのようにそれを行うことができますがあると思い:このように、

const dup = pipe(
    map(obj => map(tag => merge(obj, {tags: [tag]}), obj.tags)), 
    flatten 
); 

または、おそらくより読み出し可能:

const spread = obj => map(
    tag => merge(obj, {tags: [tag]} 
), obj.tags); 

const dup = pipe(
    map(spread), 
    flatten 
); 

これはおそらく十分な労力でポイントフリーにすることができますが、それはもっと醜い可能性があります。

Ramda REPLでこれを見ることができます。

関連する問題