Unless this is an exercise in learning Ramda, beware of the idea of wanting to do this in Ramda. I'm one of the primary authors of Ramda, and a big fan, but I need to stress that it's simply a toolkit than can help in some situations. When it helps, great, but it shouldn't be a goal.
Now, I do think it can help here. This is what I would do with 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>
An alternative, especially if the list of ids is less likely to change than the object, is this:
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>
There are some reasons not to like the placeholder ('__'). If you feel that way, you can replace includes(__, ids) with flip(includes)(ids).
Update
I don't take my own advice here. While I still would use Ramda for the filter, there is no need for propSatisfies here. A simple lambda would be perfectly fine:
const matchIds = (ids) => filter(({id}) => ids.includes(id))
This is much cleaner and more readable, at least once you're used to the Ramda norm of partial application. (filter takes two arguments: the predicate function and the object to filter with it. Since we only supply the first, this gives us back a function expecting the second. When we call that resulting function with the object, the filtering happens.)
The reason I would still use Ramda's filter is that there is no direct built-in version of it as applied to objects. Ramda supplies a simple alternative to writing a one-off object filtering.
Ramdasintax.