myArr = ['a', 'b', 'c' ];
myArr.reduce((obj, val) => ({ ...obj, [val]: val }));
根据我的理解,您期望减少值返回{ a: 'a', b: 'b', c: 'c' }
我们实际上得到的是{ 0: 'a', b: 'b', c: 'c' }
我尝试将日志放入其中,以查看第一项的内容,但输出为:
b
c
{0: "a", b: "b", c: "c"}
所以现在的行为更加奇怪了,因为在第一次val
迭代中没有任何日志。
答案 0 :(得分:3)
let myArr = ['a', 'b', 'c' ];
let result = myArr.reduce((obj, val) => ({ ...obj, [val]: val }), {});
console.log(result);
您错过了reduce
的初始值。如果没有提供初始值,则reduce
会为此目的弹出第一个元素(实际上不会发生迭代;因为1+2+3
有两个加法,而不是三个加法,除非您指定必须从0开始)
第一个元素是"a"
,从表面上看,它变成了错误的obj
;当执行{..."a", b: "b"}
时,您会看到在对象上下文中展开的..."a"
将产生字符的索引作为键;因此,...“ a”等效于...{0: "a"}
。
您没有尝试过myArr = ['hello', 'world']
的好东西-我想这真是令人惊讶(结果是{0: "h", 1: "e", 2: "l", 3: "l", 4: "o", world: "world"}
)。