Если это не упражнение в изучении Рамды, остерегайтесь идеи сделать это в Рамде. Я один из основных авторов Ramda и большой поклонник, но я должен подчеркнуть, что это просто набор инструментов, который может помочь в некоторых ситуациях. Когда это помогает, отлично, но это не должно быть целью.
Теперь я думаю, что это может помочь здесь. Вот что я бы сделал с Рамдой:
const matchIds = (obj, ids) => filter(propSatisfies(includes(__, ids), 'id'), obj)
let obj = {tom: {id: 0}, david: {id: 1}, john: {id: 2}}
let ids = [1, 2]
console.log(matchIds(obj, ids))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script>
const {__, filter, propSatisfies, includes} = R
</script>
Альтернатива, особенно если список идентификаторов изменяется с меньшей вероятностью, чем объект, заключается в следующем:
const matchIds = (ids) => filter(propSatisfies(includes(__, ids), 'id'))
let obj = {tom: {id: 0}, david: {id: 1}, john: {id: 2}}
let ids = [1, 2]
console.log(matchIds(ids)(obj))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script>
const {__, filter, propSatisfies, includes} = R
</script>
Есть несколько причин, чтобы не нравиться заполнитель ('__
'). Если вы так думаете, вы можете заменить includes(__, ids)
на flip(includes)(ids)
.
Обновление
Я не беру здесь свой совет. Хотя я бы все еще использовал Ramda для filter
, здесь нет необходимости в propSatisfies
. Простая лямбда отлично подойдет:
const matchIds = (ids) => filter(({id}) => ids.includes(id))
Это намного чище и удобочитаемее, по крайней мере, если вы привыкли к Рамда-норме частичного применения. (filter
принимает два аргумента: функцию предиката и объект для фильтрации с ним. Поскольку мы предоставляем только первое, это возвращает нам функцию, ожидающую второго. Когда мы вызываем эту результирующую функцию с объектом, происходит фильтрация. )
Причина, по которой я все еще использовал бы Рамду filter
, заключается в том, что не существует прямой встроенной версии этого применительно к объектам. Рамда предлагает простую альтернативу написанию одноразовой фильтрации объектов.