JS reduce: TypeError: 无法在 Array.reduce 上创建属性



>我有以下内容:

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

最新更新