过滤(唯一)匹配值

时间:2016-06-02 18:27:03

标签: javascript functional-programming ramda.js

使用Ramda和

const data = [{
  "id": "a",
  "name": "A"
}, {
  "id": "b",
  "name": "B"
}, {
  "id": "c",
  "name": "C"
}]

我能做到

const findById = (id, data) => R.pipe(
  R.find(R.propEq('id', id))
)(data)

const id = "a"

findById(id, data) // => { "id": "a", "name": "A" }

但是如何获取一组id值来返回只包含匹配对象的列表呢?即。

const ids = ["a", "c"]

const findByIds = (ids, data) => R.pipe(
  // ?
)(data)

findByIds(ids, data) // => [{"id": "a", "name": "A"}, {"id": "c", "name": "C"}]

像pluck,pick等一样,但是对于值而不是键,其中每个值都可以被认为是唯一的。

(首选简洁,甚至是无点变体)。

我到目前为止最接近的是交换?

  R.filter(x => R.contains(x.id, ids))

  R.takeWhile(x => R.contains(x.id, ids))

两者都产生A物体。

谢谢!我对Ramda很新,上面主要是我如何使用它,所以对此的任何见解都会非常受欢迎。

更新

这是一个非问题。它实际上适用于REPL但不适用于我本地环境(Atom + Wallaby + AVA)的测试。不知道为什么,但如果我搞清楚,我会更新。使用静态和动态密钥查看已验证的答案。听到任何其他方法仍然会很有趣。

更新2

原来这只是一个错字。也许我应该重新考虑使用复杂的哈希来测试ID。 :d

1 个答案:

答案 0 :(得分:2)

  

(首选简洁,甚至是无点变体)。

这是错误的目标。喜欢读得很好并且有效的代码。编码不是最短答案获胜的游戏,除非coding is a game where the shortest answer wins。如果你想要"打高尔夫球"代码,你应该问那里。

无论如何,你几乎自己给出了答案。

var data = [{
  "id": "a",
  "name": "A"
}, {
  "id": "b",
  "name": "B"
}, {
  "id": "c",
  "name": "C"
}];

const findByIds = R.curry((ids, data)=>
  R.filter(x=> R.contains(x.id, ids), data));

findByIds (['a', 'c']) (data);
//=> [{"id": "a", "name": "A"}, {"id": "c", "name": "C"}]

也许您希望"id"成为动态属性

var data = [{
  "id": "a",
  "name": "A"
}, {
  "id": "b",
  "name": "B"
}, {
  "id": "c",
  "name": "C"
}];

const findByProp = R.curry((prop, ids, data) =>
  R.filter(x=> R.contains(x[prop], ids), data));

findByProp ('id', ['a', 'c'], data);
//=> [{"id": "a", "name": "A"}, {"id": "c", "name": "C"}]