使用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
答案 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"}]