Kek
Kek

Reputation: 23

convert array to object using lodash

I need to convert an array or an array of arrays to an object with keys named from an array of names. Example:

//given names
    names = ['first', 'second', 'third', 'fourth'] 
//array
    param = [1, 2, 3, 4] 
//becomes 
    result = {first: 1, second: 2, third: 3, fourth: 4}

//array of arrays 
    param = [
      [1, 2, 3, 4],
      [-4, 3, 1, 32],
    ]
//becomes
    result = [
      {first: 1, second: 2, third: 3, fourth: 4},
      {first: -4, second: 3, third: 1, fourth: 32},
    ]

My current solution is this:

    var names = ['first', 'second', 'third', 'forth'];

    function arrayToObject(array, names) {
      var result = {};
      for (var i = 0; i < array.length; i++) {
        if (typeof array[i] === 'object') {
          result[i] = arrayToObject(array[i], names);
          continue;
        }
        result[names[i]] = array[i];
      }
      return result;
    }

The problem with this solution is that it always returns an object, though it should return an array of objects when I pass in an array of arrays. Is there a way to do this with lodash and I'm not seeing it?

Upvotes: 2

Views: 12742

Answers (2)

Andy
Andy

Reputation: 63589

Vanilla JS: A function that creates an object from an array:

function toObj(arr) {
  return arr.reduce(function(p, c, i) {
    p[names[i]] = c;
    return p;
  }, {});
}

Used with map:

var out = arr.map(toObj);

DEMO

Upvotes: 7

Mr. Polywhirl
Mr. Polywhirl

Reputation: 48733

You can use _.zipObject() to zip up two arrays into an object. You are essentially mapping CSV data, with headers, to JavaScript objects.

You can try to search for JavaScript CSV converters. You may find some interesting results.

// Given names
var names = [ 'first', 'second', 'third', 'fourth' ]; 
// Array
var param = [ 1, 2, 3, 4 ];
// Becomes 
var result = _.zipObject(names, param);

document.body.innerHTML = JSON.stringify(result, null, 2);

// Array of arrays 
var param = [
  [ 1, 2, 3, 4 ],
  [ -4, 3, 1, 32 ],
];
// Becomes
var result = _.chain(param).map(function(p) {
	return _.zipObject(names, p)
}).value();

document.body.innerHTML += '\n\n' + JSON.stringify(result, null, 2);
body {
  font-family: monospace;
  white-space: pre;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.min.js"></script>

Upvotes: 6

Related Questions