>我有以下内容:
let keys = ['a','b','c'];
let vals = ['1','b','h'];
const my_obj = keys.reduce(function(acc,key,i) {
return acc[key]=vals[i];
},{});
logger.log(my_obj);
我希望my_obj
{a:1,b:b,c:h}
.
我得到:
TypeError: Cannot create property 'b' on string '1'
at Array.reduce
我做错了什么?
如果你想使用reduce方法,那么它很好,但你必须返回累加器才能使其工作。
let keys = ['a', 'b', 'c'];
let vals = ['1', 'b', 'h'];
const my_obj = keys.reduce(function(acc, key, i) {
acc[key] = vals[i];
return acc;
}, {});
console.log(my_obj);
但是我建议使用简单的 for 循环,因为问题很简单
let keys = ['a', 'b', 'c'];
let vals = ['1', 'b', 'h'];
let my_obj = {};
for (let i = 0; i < keys.length; i++)
my_obj[keys[i]] = vals[i];
console.log(my_obj);
您需要将对象作为 acc 返回。 在代码中,您将返回分配的值
let keys = ['a', 'b', 'c'];
let vals = ['1', 'b', 'h'];
const my_obj = keys.reduce(function(acc, key, i) {
acc[key] = vals[i];
return acc;
}, {});
console.log(my_obj);
实际上return acc[key]=vals[i];
返回vals[i]
== 的值>您最终仅在 https://playcode.io/环境中获得h
。
已更新:在您的环境中,您收到该错误,因为:
- 第一次运行
keys.reduce
后,您的下一个acc
将被"1"
(返回acc[key]= vals[0]}
相等的回报vals[0]
即"1"
( - 现在你进入第二轮
keys.reduce
,你的acc是"1"
然后你设置acc[key]= vals[1]}
等于"1"[b] = vals[1]
==>你得到那个错误
试试这个:
let keys = ['a','b','c'];
let vals = ['1','b','h'];
const my_obj = keys.reduce(function(acc,key,i) {
// return new expanded acc
return ({...acc, [key]: vals[i]})
},{});
console.log(my_obj);