【发布时间】:2016-06-04 04:04:11
【问题描述】:
与 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
【问题讨论】:
标签: javascript functional-programming ramda.js