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

Javascript 使用下划线将两个键和值数组合并到一个对象,javascript,underscore.js,Javascript,Underscore.js,给定两个数组,一个带键,一个带值: keys = ['foo', 'bar', 'qux'] values = ['1', '2', '3'] 如何仅使用underline.js方法将其转换为对象 { foo: '1', bar: '2', qux: '3' } 我不是在寻找一个简单的javascript答案() 我问这个是作为个人练习。我以为下划线有一个方法可以做到这一点,但却发现它没有做到,这让我怀疑它是否可以做到。 我有一个答案,但它涉及很多操作。你会怎么做?你想要

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

keys = ['foo', 'bar', 'qux']
values = ['1', '2', '3']
如何仅使用underline.js方法将其转换为对象

{
   foo: '1', 
   bar: '2',
   qux: '3'
}
我不是在寻找一个简单的javascript答案()

我问这个是作为个人练习。我以为下划线有一个方法可以做到这一点,但却发现它没有做到,这让我怀疑它是否可以做到。
我有一个答案,但它涉及很多操作。你会怎么做?

你想要的是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];
var-arr=..zip(['foo','bar','qux'],['1','2','3']);
变量i,len=阵列长度;
var new_obj=[];
对于(i=0;i

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']);

请参见

您需要使用的是下划线js的方法。 如果您的Underline.js版本中不存在object方法,则必须手动将此方法添加到其中

keys=['foo','bar','qux']
值=['1','2','3']
_.object=函数(列表、值){
if(list==null)返回{};
var result={};
for(变量i=0,l=list.length;i
最干净的是

keys=['foo','bar','qux']
值=['1','2','3']
函数arr2对象(键、VAL){
返回键。减少(
功能(上一个、值、i){
上一个[值]=值[i];
返回上一个;
}, {}
);
}
console.log(Arr2object(键、值));
使用ES6:

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

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

console.log(a);
var-toObj=(ks,vs)=>ks.reduce((o,k,i)=>{o[k]=vs[i];返回o;},{});
变量键=['1','2','3'],
值=[1,2,3];
var obj=toObj(键、值);

console.log(obj);
我知道您要求使用下划线.js解决方案,但您不需要它。下面是一个使用ES7对象扩展运算符和动态键的oneliner

keys.reduce((obj, k, i) => ({...obj, [k]: values[i] }), {})

考虑到这已经4年了,Lodash或多或少已经取代了下划线,我想我会使用Lodash来分享这个解决方案:

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


简单和干净。

zip
是不够的,
.zip(['foo','bar','qux'],['1','2','3'])
[[foo',1'],['bar','2'],['qux','3']]
我添加了一个代码来使用zip返回来创建对象。下划线没有一个函数可以完全满足您的需要。感谢您的回答,是的,似乎没有纯下划线的方法来实现。很好,比我提出的更好(
zip
然后
减少
到新对象)您好@Cristi,添加了一个
\uzip
.map
替代项我有两个数组,像键和值,我想放在一个对象中,但这里提供的示例都不起作用。第一个只返回键数组。第二个返回未定义的。@rashadb:听到这个消息我很抱歉。尝试在jsfid中摆弄您的代码dle:告诉我,如果你的Underline.js版本中没有object方法,会出现什么问题,然后更新到最新版本:)你如何保存重复项?@rashadb重复项是什么意思?如果键不同,则第二个数组中的重复值将显示为不同键-值对中的值。如果第一个数组中存在重复项,则无法保留它们,因为对象不能有两个或多个同名键。你能提供一个你想要实现的例子吗?我有两个数组:[“2KE8eiJYBu”,“W5gWjvSUCp”,“aFqSkbkfgp”,“kTC0RwDalJ”,“kTC0RwDalJ”,“yCDDEWoiwM”,“yCDDEWoiwM”]和[Array[16],Array[16],Array[16],Array[16],Array[16],其中我想按顺序为每个数组创建字符串键。经过太多的努力,我用下划线作为我的解决方案,从:“act”[child,child,child,child,child,child,child]var group=.groupBy(.zip(.pluck(.map(.map)(act,function(n){return.pull(n,“user”)}),function(a){return.first(a)}),“id”),.map(.map(act,function(n){return pull.pull(n,“aValue”),(a){return first(a)}),函数(n){返回n[0]});其中,每个act“child”都有一个aValue键,它是一个对象数组,还有一个用户键,它是由多个键值对组成的对象。OP明确说明使用underline.js来解决这个问题problem@RizkiDPrast但是更多的人会阅读并考虑更多的选择。这个问题很老。简化:
keys.reduce((acc,k,i)=>(acc[k]=values[i],acc),{})
我喜欢使用reduce的想法,但你不需要每次迭代都重新创建外部对象。为什么这个问题没有得到更多的支持?干得好,@TudorMorar看着@TudorMorar的回答。“这比这个要干净得多。”Jasonsebrang我自己也用过这个模式,并在其他答案中给出了它。缺点是,它有点不可读。@torazabura实际上我同意。我有一个替代的实现,它看起来更可读,不依赖于lodash。我需要把承诺客观化。所有的,实际上应该用不同的名字来命名,有什么建议吗?谢谢。简单,干净,优雅。正如您所提到的,Lodash已经取代了下划线,因此这显然是规范的解决方案!我认为这是最有效的解决方案,因为每个键只创建一个对象,而不是一个对象。其他人以3年之差击败了你,但他们已经不存在了,所以你获得了投票权。