使用下划线将两个键和值数组合并到一个对象

Cri*_*hai 23 javascript underscore.js

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

keys = ['foo', 'bar', 'qux']
values = ['1', '2', '3']
Run Code Online (Sandbox Code Playgroud)

如何通过仅使用underscore.js方法将它转换为对象?

{
   foo: '1', 
   bar: '2',
   qux: '3'
}
Run Code Online (Sandbox Code Playgroud)

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

我问这是个人运动.我认为下划线有一种方法正是这样做,只是发现它没有,这让我想知道它是否可以完成.我有一个答案,但它涉及很多操作.你会怎么做?

小智 30

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

keys.reduce((obj, k, i) => ({...obj, [k]: values[i] }), {})
Run Code Online (Sandbox Code Playgroud)

  • @RizkiDPrast但是更多人会阅读这个并考虑更多选择.问题是陈旧的. (22认同)
  • 简化: `keys.reduce((acc, k, i) => (acc[k] =values[i], acc), {})` 我喜欢使用reduce的想法,但你不需要重新-每次迭代创建外部对象。 (5认同)

Tud*_*rar 28

使用ES6:

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

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

console.log(a);
Run Code Online (Sandbox Code Playgroud)

  • 为什么没有这个被投票更多?干得好,@ TudorMorar (2认同)

Koo*_*Inc 14

怎么样:

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

完成:另一种方法可能是:

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

为了记录,没有下划线你可以扩展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']);
Run Code Online (Sandbox Code Playgroud)

jsfiddle


Vik*_*ukh 12

你需要使用的是下划线js 的_.object方法.如果您的underscore.js版本中没有object方法,那么您必须手动将此方法添加到它.

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))
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
Run Code Online (Sandbox Code Playgroud)

  • _如果您的underscore.js_版本中没有对象方法,则**更新到最新版本**:) (3认同)

Kev*_*ary 9

鉴于这已经有4年了,Lodash或多或少取代了Underscore,我想我会用Lodash分享这个解决方案:

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

简单干净.


cap*_*ipo 6

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);
Run Code Online (Sandbox Code Playgroud)