What is clojure.core equivalent of lodash _.pluck

818 Views Asked by At

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, 'user.name');
// ["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.

5

There are 5 best solutions below

0
On BEST ANSWER

Here are simple tricks:

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

(map :a my-coll)
 => ({:z 1} {:z 2})

(map (comp :z :a) my-coll)
 => (1 2)

Works because keyword behaves like a function as well.

0
On

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.

0
On

The most simple way is something like:

(map #(:user %) users)

It will return list '(36 40)

0
On

lodash deprecated _.pluck function in favor of _.map. Thus:

_.pluck(users, 'user')

is now

_.map(users, 'user')

I like the lodash/fp flavor, wich put the iteratees in front of the collection

_.map('user', users)

You also get autocurry for free

_.map('user')(users)
0
On

This function in lodash is now called pick and I believe its closest equivalent in Clojure is select-keys.