Convert object array to hash map, indexed by an attribute value of the Object

470,393

Solution 1

This is fairly trivial to do with Array.prototype.reduce:

var arr = [
    { key: 'foo', val: 'bar' },
    { key: 'hello', val: 'world' }
];

var result = arr.reduce(function(map, obj) {
    map[obj.key] = obj.val;
    return map;
}, {});

console.log(result);
// { foo:'bar', hello:'world' }

Note: Array.prototype.reduce() is IE9+, so if you need to support older browsers you will need to polyfill it.

Solution 2

Using ES6 Map (pretty well supported), you can try this:

var arr = [
    { key: 'foo', val: 'bar' },
    { key: 'hello', val: 'world' }
];

var result = new Map(arr.map(i => [i.key, i.val]));

// When using TypeScript, need to specify type:
// var result = arr.map((i): [string, string] => [i.key, i.val])

// Unfortunately maps don't stringify well.  This is the contents in array form.
console.log("Result is: " + JSON.stringify([...result])); 
// Map {"foo" => "bar", "hello" => "world"}

Solution 3

You can use the new Object.fromEntries() method.

Example:

const array = [
   {key: 'a', value: 'b', redundant: 'aaa'},
   {key: 'x', value: 'y', redundant: 'zzz'}
]

const hash = Object.fromEntries(
   array.map(e => [e.key, e.value])
)

console.log(hash) // {a: b, x: y}

Solution 4

Using ES6 spread + Object.assign:

array = [{key: 'a', value: 'b', redundant: 'aaa'}, {key: 'x', value: 'y', redundant: 'zzz'}]

const hash = Object.assign({}, ...array.map(s => ({[s.key]: s.value})));

console.log(hash) // {a: b, x: y}

Solution 5

With lodash, this can be done using keyBy:

var arr = [
    { key: 'foo', val: 'bar' },
    { key: 'hello', val: 'world' }
];

var result = _.keyBy(arr, o => o.key);

console.log(result);
// Object {foo: Object, hello: Object}
Share:
470,393
Naveen I
Author by

Naveen I

Updated on January 30, 2022

Comments

  • Naveen I
    Naveen I over 2 years

    Use Case

    The use case is to convert an array of objects into a hash map based on string or function provided to evaluate and use as the key in the hash map and value as an object itself. A common case of using this is converting an array of objects into a hash map of objects.

    Code

    The following is a small snippet in JavaScript to convert an array of objects to a hash map, indexed by the attribute value of object. You can provide a function to evaluate the key of hash map dynamically (run time).

    function isFunction(func) {
        return Object.prototype.toString.call(func) === '[object Function]';
    }
    
    /**
     * This function converts an array to hash map
     * @param {String | function} key describes the key to be evaluated in each object to use as key for hashmap
     * @returns Object
     * @Example 
     *      [{id:123, name:'naveen'}, {id:345, name:"kumar"}].toHashMap("id")
     *      Returns :- Object {123: Object, 345: Object}
     *
     *      [{id:123, name:'naveen'}, {id:345, name:"kumar"}].toHashMap(function(obj){return obj.id+1})
     *      Returns :- Object {124: Object, 346: Object}
     */
    Array.prototype.toHashMap = function(key) {
        var _hashMap = {}, getKey = isFunction(key)?key: function(_obj){return _obj[key];};
        this.forEach(function (obj){
            _hashMap[getKey(obj)] = obj;
        });
        return _hashMap;
    };
    

    You can find the gist here: Converts Array of Objects to HashMap.