在Codefights中,我找到了解决其中一项挑战的解决方案:
alternatingSums = a => a.reduce((accum,value,i) => (accum[i&1] += value, accum), [0,0])
这给出了相同的结果:
alternatingSums = a => a.reduce((accum,value,i) => {
accum[i&1] += value
return accum
}, [0,0])
我无法理解的部分是,为什么将两个数组括在括号内会返回带有在正确索引中添加的累加的数组。
我找不到与此有关的任何文档,因此我进行了一些实验来试图弄清楚它是如何工作的,但是我仍然为此感到困惑:
const a = [1,2]
console.log( (a) ) // return [1,2]
console.log( (a,a) ) // return [1,2]
console.log( (a,a,a) ) // return [1,2]
console.log( (a[0]) ) // return 1
console.log( (a[0],a) ) // return [1,2]
console.log( (a[0],a,a) ) // return [1,2]
console.log( (a[0]+=1) ) // return 2, a[0] is incremented
console.log( (a[0]+=1,a) ) // return [3,2], a[0] is incremented
console.log( (a[0]+=1,a,a) ) // return [4,2], a[0] is incremented
最佳答案
我无法理解的部分是,为什么将两个数组括在括号内会返回带有在正确索引中添加的累加的数组。(accum,value,i)
和(accum[i&1] += value, accum)
不是数组。数组使用[]
,而不是()
。(accum,value,i)
是arrow function的参数列表。我们知道,因为下一个标记是=>
。(accum[i&1] += value, accum)
是箭头功能的主体,特别是简洁的主体。我们知道这是因为它紧随=>
而不是不是以{
开头(它将以冗长的主体开头)。简洁的主体在grouping operator (()
)表达式周围使用comma operator。逗号运算符是JavaScript中更有趣的运算符之一:它评估其左操作数,将该值扔掉,然后评估其右操作数,并将其作为结果值。在这里,它用于更新accum[i&i]
值的左侧操作数的副作用。
由于(accum[i&1] += value, accum)
是组成箭头函数的简洁主体的表达式,因此将其结果(accum
)用作函数的返回值。
“这将产生相同的结果”之后的代码块是使用return
语句将箭头功能的简洁主体完美转换为冗长的主体(很好!)的功能,并且完全相同。