给定两个数组,一个带键,一个带值:
keys = ['foo', 'bar', 'qux']
values = ['1', '2', '3']
如何通过仅使用underscore.js方法将 转换为对象 ?
{
foo: '1',
bar: '2',
qux: '3'
}
我不是在寻找简单的javascript答案(like this)。
我认为这是个人练习。我认为下划线有一种方法正是这样做,只是发现它没有,这让我想知道它是否可以完成。 我有一个答案,但它涉及很多操作。你会怎么做?
答案 0 :(得分:27)
我知道你问过Underscore.js解决方案,但你不需要它。这是一个使用ES7对象扩展运算符和动态密钥的oneliner。
keys.reduce((obj, k, i) => ({...obj, [k]: values[i] }), {})
答案 1 :(得分:23)
使用ES6:
let numbers = [1, 2, 3],
names = ["John", "Mike", "Colin"];
let a = Object.assign({}, ...numbers.map((n, index) => ({[n]: names[index]})))
console.log(a);
答案 2 :(得分: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
答案 3 :(得分:11)
您需要使用的是下划线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))
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
答案 4 :(得分:9)
鉴于这已经有4年了,Lodash或多或少取代了Underscore,我想我会用Lodash分享这个解决方案:
var keys = ['foo', 'bar', 'qux'];
var values = ['1', '2', '3'];
var obj = _.zipObject( keys, values );
简单干净。
答案 5 :(得分:6)
company
&#13;
答案 6 :(得分: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
。
答案 7 :(得分:2)
您正在寻找的是拉链功能。
编辑: 它不会创建对象,但会通过创建子数组
来组合数组没有任何功能可以完全满足您的需求。但是你可以使用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];