【问题标题】:Array.reduce - strange behaviour with objectsArray.reduce - 对象的奇怪行为
【发布时间】:2018-11-05 20:14:16
【问题描述】:

myArr = ['a', 'b', 'c' ]; myArr.reduce((obj, val) => ({ ...obj, [val]: val }));

根据我的理解,您预计 reduce 会返回 { a: 'a', b: 'b', c: 'c' }

我们实际上得到的是{ 0: 'a', b: 'b', c: 'c' }

我试着在里面放一个日志来看看第一个项目发生了什么,但输出是:

b c {0: "a", b: "b", c: "c"}

所以现在这种行为更加奇怪了,因为我们没有得到第一次 val 迭代的任何日志。

【问题讨论】:

    标签: javascript arrays reduce


    【解决方案1】:

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

    【讨论】:

    • 这很有意义 - 如果我尝试使用不同的数组(如你提到的 hello world)我相信我会知道发生了什么,但只有一个字符弦我的心被炸了。为答案干杯!
    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 2011-12-19
    • 2010-12-06
    • 1970-01-01
    • 2015-01-09
    • 2015-04-20
    • 1970-01-01
    • 2023-01-29
    相关资源
    最近更新 更多