使用Map和Filter传播语法

时间:2017-03-29 18:46:27

标签: javascript arrays ecmascript-6 functional-programming spread-syntax

我发现了这个有趣的问题,想与你们分享。 问题是:

[...[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' s被排除在过滤器
  • 之外
  • 7在那里做什么

4 个答案:

答案 0 :(得分: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]

答案 1 :(得分:1)

  • 此处的第一个操作是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],并且spread operator返回[1, 1, 2, 7],摆脱了嵌套数组。

答案 2 :(得分: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]。所以,结果总是id | cars 1 Ford 2 BMW 3 Fiat id | id_cars | sales | sale_date 1 1 20 2016 2 1 30 2017 3 2 25 2017 4 2 35 2016 5 3 15 2017 SELECT car.id, car.cars, SUM(sal.sales) AS value_sales FROM cars car LEFT JOIN sales_cars sal ON car.id = sal.id_cars GROUP BY car.id

答案 3 :(得分: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]