简体   繁体   中英

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?

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

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> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM