Array.reduce-对象的奇怪行为

时间:2018-11-05 12:06:11

标签: javascript arrays reduce

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迭代中没有任何日志。

1 个答案:

答案 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"})。

相关问题