我有:
var keys = [ "height", "width" ];
var values = [ "12px", "24px" ];
我想把它转换成这个对象:
{ height: "12px", width: "24px" }
在Python中,有一个简单的习语
dict(zip(keys,values))
。在jQuery或纯JavaScript中是否有类似的东西,还是我必须走一条漫长的路?我有:
var keys = [ "height", "width" ];
var values = [ "12px", "24px" ];
我想把它转换成这个对象:
{ height: "12px", width: "24px" }
dict(zip(keys,values))
。在jQuery或纯JavaScript中是否有类似的东西,还是我必须走一条漫长的路?使用数组reduce
的最简单的ES6一行代码解决方案:
const keys = ['height', 'width'];
const values = ['12px', '24px'];
const merged = keys.reduce((obj, key, index) => ({ ...obj, [key]: values[index] }), {});
console.log(merged);
简单的JS函数如下:
function toObject(names, values) {
var result = {};
for (var i = 0; i < names.length; i++)
result[names[i]] = values[i];
return result;
}
当然,你还可以实际上用JS支持的高阶类型来实现像zip等函数,这些功能式语言主义也很容易 :D
const keys = ["height", "width"];
const values = ["12px", "24px"];
const result = {};
keys.forEach((key, idx) => result[key] = values[idx]);
console.log(result);
map
方法将两个数组合并,然后使用Object.fromEntries
进行转换。
var keys = ["height", "width"];
var values = ["12px", "24px"];
var array = keys.map((el, i) => {
return [keys[i], values[i]];
});
// → [["height", "12px"], ["width", "24px"]]
var output = Object.fromEntries(array);
// → {height: "12px", width: "24px"}
console.log(output);
以不可变性为中心的功能性方法:
const zipObj = xs => ys => xs.reduce( (obj, x, i) => ({ ...obj, [x]: ys[i] }), {})
const arr1 = ['a', 'b', 'c', 'd']
const arr2 = ['e', 'f', 'g', 'h']
const obj = zipObj (arr1) (arr2)
console.log (obj)
/**
* Apply to an existing or new object, parallel arrays of key-value pairs.
*
* @param {string[]} keys - List of keys corresponding to their accociated values.
* @param {object[]} vals - List of values corresponding to their accociated keys.
* @param {object} [ref={}] - Optional reference to an existing object to apply to.
*
* @returns {object} - The modified or new object with the new key-value pairs applied.
*/
function toObject(keys, vals, ref) {
return keys.length === vals.length ? keys.reduce(function(obj, key, index) {
obj[key] = vals[index];
return obj;
}, ref || {}) : null;
}
var keys = [ "height" , "width" ];
var values = [ "12px" , "24px" ];
document.body.innerHTML = '<pre>' + JSON.stringify(toObject(keys, values), null, 2) + '</pre>';
Object.fromEntries
,我们就可以像这样做:
const keys = [ "height", "width" ];
const values = [ "12px", "24px" ];
const myObject = Object.fromEntries(
values.map((value, index) => [keys[index], value])
);
console.log(myObject);
const keys = ["Adam", "Betty", "Charles"];
const values = [50, 1, 90];
const obj = keys.reduce((acc, key, i) => {
acc[key] = values[i];
return acc;
}, {});
console.log(obj);
或者,如果您考虑使用库,可以使用lodash zipobject,它可以完成您所需的操作。
您可以转置数组并获取具有条目的对象。
const
transpose = (r, a) => a.map((v, i) => [...(r[i] || []), v]),
keys = [ "height", "width" ],
values = [ "12px", "24px" ],
result = Object.fromEntries([keys, values].reduce(transpose, []));
console.log(result);