以下减速机功能如何工作?

时间:2018-02-20 19:51:46

标签: javascript arrays

const objectFromPairs = arr => arr.reduce((a, v) => ((a[v[0]] = v[1]), a), {});
console.log(objectFromPairs([['a', 1], ['b', 2]])); // {a: 1, b: 2}

我无法绕过这个。回调(a, v) => ((a[v[0]] = v[1]), a)做了什么 - 不是减速器的回调应该是just a function,为什么有一个逗号后跟一个逗号然后累加器?我怎么理解这个?

当它为(a, v) => a[v[0]] = v[1]时,为什么会返回2?它不应该在第一次迭代时返回{a: 1},然后返回{b: 2},那么我们最终不应该使用{b: 2}而不仅仅是2吗?

2 个答案:

答案 0 :(得分:3)

  

我无法绕过这个。

可以理解 - 它使用相对模糊(并禁止!)comma operator。您可以将其扩展为等效语句,以使其更具可读性:

const objectFromPairs = arr => arr.reduce((a, v) => {
    a[v[0]] = v[1];
    return a;
}, {});

但仍然是对reduce的滥用。这是一个通用函数;它不需要打高尔夫球。

const objectFromPairs = pairs => {
    const object = {};

    pairs.forEach(([key, value]) => {
        object[key] = value;
    });

    return object;
};

答案 1 :(得分:2)

从内部开始并解决:

(a, v) => ((a[v[0]] = v[1]), a)

这是一个减少回调,需要一个"累加器"参数(a)和"值"参数(v)。函数体的作用是使用逗号运算符表达式语句来解决使用花括号和显式return的需要。逗号运算符表达式(a[v[0]] = v[1])中的第一个子表达式将两值数组拆分为对象属性和值的名称。也就是说,v[0]成为累加器对象中属性的名称,v[1]是该属性的值。

现在用于.reduce()调用数组,{}作为.reduce()累加器的初始值。因此,该函数使用从源数组中获取的值来构建属性,其元素显然需要是数组本身,因为这是回调所期望的。

看起来你困惑的关键是逗号运算符。当JavaScript函数体只是一个表达式时,JavaScript中的箭头函数只有隐含的返回值。逗号运算符是一种欺骗"欺骗"一点点:您可以将几个表达式串在一起,整体结果是 last 表达式的值。对于箭头功能,这很方便。