tusharmath
tusharmath

Reputation: 11002

Cherry picking properties in CoffeeScript

Is there a way in CoffeeScript to reduce the code size but still have the same effect as -

{hours, seconds, minutes} = data
x = {hours, seconds, minutes}

Upvotes: 1

Views: 269

Answers (2)

user663031
user663031

Reputation:

In ES6, one idiom is

(({hours, seconds, minutes}) => ({hours, seconds, minutes})) (data)
  ^^^^^^^^^^^^^^^^^^^^^^^^^      ^^^^^^^^^^^^^^^^^^^^^^^^^ 
  deconstruct argument           return object constructed 
  into variables                 using object literal
                                 shorthand
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^
                    DEFINE FAT ARROW FUNCTION                CALL IT 

Whether you think is is good or horrible is ultimately a matter of personal preference.

What we really need is a pick operator in the language, so I could write

{hours, seconds, minutes} PICK data

For this I am proposing #, so

{hours, seconds, minutes} # data

Related: One-liner to take some properties from object in ES 6

Upvotes: 0

Leonid Beschastny
Leonid Beschastny

Reputation: 51490

There are several ways to do it.

The best one is to adopt some helpful library, e.g. underscore or lodash:

x = _.pick data, 'hours', 'seconds', 'minutes'

But if you don't want to include external library to your project, then you may use one of the following methods.

Function call:

x = (->{@hours, @seconds, @minutes}).call data

Define custom reusable pick method:

Object::pick = (args...) ->
  res = {}
  res[k] = @[k] for k in [].concat args
  res

x = data.pick 'hours', 'seconds', 'minutes'

Upvotes: 3

Related Questions