30

给定两个数组,一个带键,一个带值:

keys = ['foo', 'bar', 'qux']
values = ['1', '2', '3']

您将如何仅使用 underscore.js 方法将其转换为对象?

{
   foo: '1', 
   bar: '2',
   qux: '3'
}

我不是在寻找一个简单的 javascript 答案(像这样)。

我问这是个人练习。我认为 underscore 有一种方法可以做到这一点,只是发现它没有,这让我想知道它是否可以做到。我有一个答案,但它涉及相当多的操作。你会怎么做?

4

8 回答 8

48

我知道您要求 Underscore.js 解决方案,但您不需要它。这是一个使用 ES7 对象扩展运算符和动态键的 oneliner。

keys.reduce((obj, k, i) => ({...obj, [k]: values[i] }), {})
于 2016-12-03T06:50:34.780 回答
39

使用 ES6:

let numbers = [1, 2, 3],
    names = ["John", "Mike", "Colin"];

let a = Object.assign({}, ...numbers.map((n, index) => ({[n]: names[index]})))

console.log(a);
于 2016-08-12T10:52:30.003 回答
15

需要用到的是下划线js的_.object方法。如果您的 underscore.js 版本中不存在对象方法,那么您必须手动添加此方法。

keys = ['foo', 'bar', 'qux']
values = ['1', '2', '3']
_.object = function(list, values) {
  if (list == null) return {};
  var result = {};
  for (var i = 0, l = list.length; i < l; i++) {
    if (values) {
      result[list[i]] = values[i];
    } else {
      result[list[i][0]] = list[i][1];
    }
  }
  return result;
};

console.log(_.object(keys, values))
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

于 2013-01-18T13:30:27.647 回答
14

怎么样:

keys = ['foo', 'bar', 'qux'];
values = ['1', '2', '3'];
some = {};
_.each(keys,function(k,i){some[k] = values[i];});

要完整:另一种方法可能是:

 _.zip(['foo', 'bar', 'qux'],['1', '2', '3'])
  .map(function(v){this[v[0]]=v[1];}, some = {});

作为记录,没有下划线你可以扩展 Array.prototype:

Array.prototype.toObj = function(values){
   values = values || this.map(function(v){return true;}); 
   var some;
   this .map(function(v){return [v,this.shift()]},values)
        .map(function(v){this[v[0]]=v[1];},some = {});
   return some; 
};
// usage
var some = ['foo', 'bar', 'qux'].toObj(['1', '2', '3']);

jsfiddle

于 2012-08-30T14:59:12.513 回答
14

鉴于这是 4 年的历史,并且 Lodash 或多或少地取代了 Underscore,我想我会使用 Lodash 分享这个解决方案:

var keys = ['foo', 'bar', 'qux'];
var values = ['1', '2', '3'];
var obj = _.zipObject( keys, values );

简单干净。

于 2017-02-06T20:21:19.837 回答
7

var toObj = (ks, vs) => ks.reduce((o,k,i)=> {o[k] = vs[i]; return o;}, {});

var keys=['one', 'two', 'three'],
    values = [1, 2, 3];
var obj = toObj(keys, values);
console.log(obj);

于 2016-10-01T00:40:31.663 回答
4

最干净的是

keys = ['foo', 'bar', 'qux']
values = ['1', '2', '3']

function Arr2object(keys, vals) {
  return keys.reduce(
    function(prev, val, i) {
      prev[val] = vals[i];
      return prev;
    }, {}
  );
}

console.log(Arr2object(keys, values));

或者,使用_.reduce,但如果你使用下划线,你已经有了_.object.

于 2013-07-22T03:20:53.237 回答
2

您正在寻找的是 zip 功能。

拉链功能

编辑:它不会创建对象,但会通过创建子数组来组合数组

没有功能可以完全满足您的需求。但是您可以使用 zip 的结果来创建您的对象。

var arr = _.zip(['foo', 'bar', 'qux'], ['1', '2', '3']);
var i, len = arr.length;
var new_obj = [];

for(i=0; i<len; ++i)
   new_obj[arr[i][0]] = arr[i][1];
于 2012-08-30T14:29:01.317 回答