0

我发现了这个有趣的问题,并想与大家分享。问题是 :

[...[0,1,...[-1,0,1].map((x)=> x+1)].filter((x)=>x)),7]

我很容易解决了过滤器的第一部分[0,1,(-1+1),(0+1),(1+1)] = [0,1,0,1,2]

我惊讶地发现 7 挂在最后。我认为这是一些错字,但将问题复制到控制台给了我 [1,1,2,7]。我不太明白两件事。

  • 为什么 0 被排除在过滤器之外
  • 7 在那里做什么
4

4 回答 4

3
  • 这里的第一个操作是Array#map [-1, 0, 1].map(x => x + 1),它基本上添加1到每个元素,返回[0, 1, 2]数组。

  • 下一个是Array#filter操作,[0, 1, ...[0, 1, 2]].filter(x => x)它实际上返回一个新数组,而不是数组中的每个falsy(false, 0, undefined, null, "")

  • 最后一个操作看起来像[...[1, 1, 2], 7]并摆脱了嵌套数组,扩展运算符返回[1, 1, 2, 7]

于 2017-03-29T18:54:02.190 回答
1

[...[0,1,...[-1,0,1].map((x)=> x+1)].filter((x)=>x),7] 细分:

[-1,0,1].map((x)=> x+1) // [0,1,2]

[0,1,...[-1,0,1].map((x)=> x+1)] // [0,1,0,1,2]

[0,1,...[-1,0,1].map((x)=> x+1)].filter((x)=>x) // [1,1,2]

[...[0,1,...[-1,0,1].map((x)=> x+1)].filter((x)=>x),7] // [1,1,2,7]
于 2017-03-29T18:51:12.250 回答
0

这部分[-1,0,1].map((x)=> x+1)结果是这个列表[0,1,2],然后这部分[0,1,...[-1,0,1].map((x)=> x+1)]结果是[0,1,1,2]在过滤器部分丢弃之后,0所以结果[1,1,2]是,最后列表的最后一个元素是7。所以,总的来说结果是[1,1,2,7]

于 2017-03-29T18:50:21.487 回答
0

代码按以下步骤进行评估:

[...[0, 1, ...[-1, 0, 1].map((x)=>x+1)].filter((x)=>x)), 7] // map
[...[0, 1, ...[(x=>x+1)(-1), (x=>x+1)(0), (x=>x+1)(1)]].filter((x)=>x)), 7] // function application
[...[0, 1, ...[0, 1, 2]].filter((x)=>x)), 7] // spread
[...[0, 1, 0, 1, 2].filter((x)=>x)), 7] // filter
[...[...(x=>x)(0)?[0]:[], ...(x=>x)(1)?[1]:[], ...(x=>x)(0)?[0]:[], ...(x=>x)(1)?[1]:[], ...(x=>x)(2)?[2]:[]], 7] // function application
[...[...0?[0]:[], ...1?[1]:[], ...0?[0]:[], ...1?[1]:[], ...2?[2]:[]], 7] // conditional
[...[...[], ...[1], ...[], ...[1], ...[2]], 7] // spread (from filter)
[...[1, 1, 2], 7] // spread
[1, 1, 2, 7]
于 2017-03-29T18:59:20.187 回答