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. ;-)
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 )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With