Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mapping an array of objects to key/value pairs in CoffeeScript

I have an array of elements that I would like to apply a mapping to to convert it into key value pairs on a single object (to mimic an associative array).

The approach in Can destructuring assignment be used to effect a projection in CoffeeScript? does not seem to work for me as it results in a simple array instead of key/value pairs.

My language of choice is CoffeeScript or JavaScript.

An example:

[{name: 'a', value: 'b', other: 'c'}, {name: 'd', value: 'e', other: 'f'}] 

is supposed to be transformed into:

{   a: 'b',   d: 'e' } 

One-liners are preferred. ;-)

like image 456
Thilo-Alexander Ginkel Avatar asked Dec 01 '11 21:12

Thilo-Alexander Ginkel


1 Answers

var arr = [{name: 'a', value: 'b', other: 'c'}, {name: 'd', value: 'e', other: 'f'}];  var obj = arr.reduce(function ( total, current ) {     total[ current.name ] = current.value;     return total; }, {}); 

Pure javascript. It's practically a one liner, and it looks hawt.

Array.prototype.reduce is ES5, but isn't difficult to shim. Here's an example shim:

Array.prototype.reduce = function ( fun, initVal ) {     var sum = initVal || this[ 0 ],         i = 1, len = this.length;      do {         sum = fun.call( undefined, sum, this[i], i, this );     } while ( ++i < len );      return sum; }; 

arr.reduce is a sophisticated version of arr.map, which is a sophisticated version of arr.forEach. You can do this for the same effect:

var obj = {}; arr.forEach(function ( val ) {     obj[ val.name ] = val.value; });  //and using jQuery.each var obj = {}; $.each( arr, function ( index, val ) {     obj[ val.name ] = val.value; });  //latter version in coffeescript: obj = {} $.each( arr, (index, val) ->     obj[ val.name ] = val.value ) 
like image 132
Zirak Avatar answered Sep 26 '22 06:09

Zirak