its*_*dok 25 javascript idioms
我有:
var keys = [ "height", "width" ];
var values = [ "12px", "24px" ];
Run Code Online (Sandbox Code Playgroud)
我想把它转换成这个对象:
{ height: "12px", width: "24px" }
Run Code Online (Sandbox Code Playgroud)
在Python中,有一个简单的习语dict(zip(keys,values)).在jQuery或普通的Javascript中是否有类似的东西,或者我必须做很长的事情吗?
oll*_*iej 20
简单的JS功能是:
function toObject(names, values) {
var result = {};
for (var i = 0; i < names.length; i++)
result[names[i]] = values[i];
return result;
}
Run Code Online (Sandbox Code Playgroud)
当然,您也可以实现像zip等功能,因为JS支持更高阶的类型,这使得这些功能语言易于使用:D
ang*_*wan 18
使用lodash.
例
_.zipObject(['a', 'b'], [1, 2]);
// ? { 'a': 1, 'b': 2 }
Run Code Online (Sandbox Code Playgroud)
Yii*_*iin 14
使用Array的最简单的ES6单线解决方案reduce:
const keys = ['height', 'width'];
const values = ['12px', '24px'];
const merged = keys.reduce((obj, key, index) => ({ ...obj, [key]: values[index] }), {});
Run Code Online (Sandbox Code Playgroud)
Syl*_*oux 10
作为替代解决方案,我还没有提到:
var result = {};
keys.forEach((key, idx) => result[key] = values[idx]);
Run Code Online (Sandbox Code Playgroud)
您可以使用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);Run Code Online (Sandbox Code Playgroud)
考虑到不变性的函数式方法:
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)Run Code Online (Sandbox Code Playgroud)