ma2s ma2s - 6 months ago 27
Javascript Question

What is clojure.core equivalent of lodash _.pluck

Lodash _.pluck does this

var users = [
{ 'user': 'barney', 'age': 36 },
{ 'user': 'fred', 'age': 40 }

_.pluck(users, 'user');
// → ['barney', 'fred']

Good thing about it is it can also go deep like this:

var users = [
{ 'user': {name: 'barney'}, 'age': 36 },
{ 'user': {name: 'fred'}, 'age': 40 }

_.pluck(users, '');
// ["barney", "fred"]

Is there equivalent in Clojure core of this? I mean, I can easily create one line somewhat like this

(defn pluck
[collection path]
(map #(get-in % path) collection))

And use it like this:

(def my-coll [{:a {:z 1}} {:a {:z 2}}])
(pluck my-coll [:a :z])
=> (1 2)

I was just wondering if there's such thing already included in Clojure and I overlooked it.


There is no built-in function for this. You can refer to clojure.core API reference and the cheatsheet to look up what's available.

I would say Clojure's syntax is light enough that it feels sufficient to use a combination of map and an accessor utility like get-in.

This also demonstrates a well-adopted principle in Clojure community: provide mostly simple defaults and let the users compose them as they need. Some people would probably argue that pluck conflates iteration and querying.