[英]How does the following reducer function work?
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)
作用是什么-不是reducer的回调应该只是一个函数 ,为什么要在赋值后加上a逗号然后累加器? 我如何理解这一点?
当(a, v) => a[v[0]] = v[1]
,为什么返回2
? 它不应该在第一次迭代时返回{a: 1}
,然后返回{b: 2}
,所以我们不应该以{b: 2}
而不是仅仅2
吗?
我无法解决这个问题。
可以理解–它使用相对晦涩(且禁止使用)的逗号运算符 。 您可以将其扩展为等效的语句,以使其更具可读性:
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;
};
从内部开始并解决:
(a, v) => ((a[v[0]] = v[1]), a)
这是一个reduce回调,它带有一个“累加器”参数( a
)和一个“值”参数( v
)。 函数主体的作用是使用逗号运算符表达式语句来解决使用花括号和显式return
。 逗号运算符表达式中的第一个子表达式(a[v[0]] = v[1])
将一个两个值的数组拆分为一个对象属性的名称和一个值。 也就是说, v[0]
成为累加器对象中某个属性的名称,而v[1]
是该属性的值。
现在,将其用于对数组进行的.reduce()
调用中,其中{}
为.reduce()
累加器的初始值。 因此,该函数使用从源数组中获取的值来构建属性,这些值显然需要本身就是数组,因为这就是回调所期望的。
看起来您困惑的关键是逗号运算符。 JavaScript中的箭头函数仅在其函数主体只是单个表达式时才具有隐式返回值。 逗号运算符是“欺骗”一点的一种方式:您可以将几个表达式串在一起,总的结果是最后一个表达式的值。 对于箭头功能,这很方便。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.