【问题标题】:convert array to object using lodash使用 lodash 将数组转换为对象
【发布时间】:2016-03-18 11:56:31
【问题描述】:

我需要将一个数组或数组数组转换为一个对象,该对象的键名是从名称数组中命名的。示例:

//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},
    ]

我目前的解决方案是这样的:

    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;
    }

这个解决方案的问题是它总是返回一个对象,尽管当我传入一个数组数组时它应该返回一个对象数组。有没有办法用 lodash 做到这一点,我没有看到它?

【问题讨论】:

  • 您的副本和结果不匹配。副本未声明。
  • 已修复,忘记重命名
  • 那就没问题了。您将结果声明为对象。写 if 语句:result = [] if array, result = {} if hash
  • 谢谢,我知道。这就是为什么我要求像 lodash 解决方案这样的东西,因为它尽可能简洁:)
  • 正如我在下面提到的,_.zipObject() 很简洁。

标签: javascript arrays object lodash


【解决方案1】:

Vanilla JS:从数组创建对象的函数:

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

map一起使用:

var out = arr.map(toObj);

DEMO

【讨论】:

  • 聪明,没想到map和reduce一起使用
【解决方案2】:

您可以使用_.zipObject() 将两个数组压缩到一个对象中。您实际上是将带有标头的 CSV 数据映射到 JavaScript 对象。

您可以尝试搜索 JavaScript CSV 转换器。您可能会发现一些有趣的结果。

// 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;
}
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 我会研究一下 CSV 转换器,谢谢 :)。虽然这确实是 lodash 中的一个解决方案,但我会选择 Andys 解决方案,因为它和你的一样简洁,最重要的是香草。
  • 好吧,我也会使用 reduce,因为它很简单,但你要求一个 lodash 解决方案......
猜你喜欢
  • 1970-01-01
  • 2016-08-06
  • 2019-01-26
  • 2019-04-18
  • 2019-08-09
  • 1970-01-01
  • 2015-10-12
相关资源
最近更新 更多