基于道具列表的重复对象

时间:2016-12-07 10:21:16

标签: ramda.js

我有一个这样的对象列表:

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

1 个答案:

答案 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 上看到这一点。