在Codefights中,我找到了解决其中一个挑战的解决方案:
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
我无法理解的部分是为什么在括号内包含两个数组会返回数组,并在正确的索引中添加了累积的数据。
我找不到任何关于此的文档,所以我做了一些实验,试图弄清楚它是如何工作的,但我仍然在努力解决这个问题:
{{1}}
答案 0 :(得分:3)
我无法理解的部分是为什么在括号内包含两个数组会返回数组,并在正确的索引中添加了累积。
(accum,value,i)
和(accum[i&1] += value, accum)
不是数组。数组使用[]
,而非()
。
(accum,value,i)
是arrow function的参数列表。我们知道,因为下一个标记是=>
。
(accum[i&1] += value, accum)
是箭头功能的 body ,特别是简洁的身体。我们知道,因为它紧跟在=>
之后,并且不以{
开头(这将开始一个冗长的主体)。这个简洁的机构使用grouping operator (()
)表达式comma operator。逗号运算符是JavaScript更有趣的运算符之一:它计算其左侧操作数,抛出该值,然后计算其右侧操作数并将其作为结果值。在这里,它被用于更新accum[i&i]
值的左手操作数的副作用。
由于(accum[i&1] += value, accum)
是构成箭头函数简洁体的表达式,因此其结果(accum
)用作函数的返回值。
之后的代码块“这给出了相同的结果”是将箭头函数的简洁主体完美地翻译成具有return
语句的详细正文(很好的!),并且完全相同的事情。