我有一个这样的对象列表:
var original = [
{
prop1: 1,
prop2: 2,
tags: ["tag1", "tag2"]
},
{
prop1: 3,
prop2: 4,
tags: ["tag1", "tag3", "tag4"]
},
{
prop1: 5,
prop2: 6,
tags: ["tag4"]
}
]
我想基于标签复制对象,以便最终使用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)
)
答案 0 :(得分: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 上看到这一点。