在CoffeeScript中获取数组的第一个和最后一个元素

rev*_*ver 27 arrays coffeescript

如果说我有一个数组,我会迭代数组,但做一些与第一个和最后一个元素不同的东西.我该怎么办?

以下面的代码为例,如何提醒元素ae

array = [a,b,c,d,e]
for element in array
  console.log(element)
Run Code Online (Sandbox Code Playgroud)

谢谢.

Jon*_*ier 57

您可以使用splat 使用数组解构来检索第一个和最后一个元素:

[first, ..., last] = array
Run Code Online (Sandbox Code Playgroud)

CoffeeScript> = 1.7.0支持此splat用法.


epi*_*ian 24

访问数组的第一个和最后一个元素的vanilla方式与JS中的相同:使用索引0length - 1:

console.log array[0], array[array.length - 1]
Run Code Online (Sandbox Code Playgroud)

CoffeeScript允许你编写一些很好的数组解构表达式:

[first, mid..., last] = array
console.log first, last
Run Code Online (Sandbox Code Playgroud)

但是如果你不打算使用中间元素,我认为这不值得.

Underscore.js有一些帮助器firstlast方法可以使它更像英语(我不想使用短语"自解释",因为我认为任何程序员都会理解数组索引).Array如果你不想使用Underscore并且你不介意污染全局命名空间(这是其他库,比如Sugar.js那样),它们很容易添加到对象中:

Array::first ?= (n) ->
  if n? then @[0...(Math.max 0, n)] else @[0]

Array::last ?= (n) ->
  if n? then @[(Math.max @length - n, 0)...] else @[@length - 1]

console.log array.first(), array.last()
Run Code Online (Sandbox Code Playgroud)

更新

此函数还允许您获取数组中的n个第一个或最后一个元素.如果您不需要该功能,那么实现将更简单(else基本上只是分支).

更新2

CoffeeScript > = 1.7允许你写:

[first, ..., last] = array
Run Code Online (Sandbox Code Playgroud)

不使用中间元素生成不必要的数组:D

  • 虽然你的`first`和`last`原型方法优雅且有用,但应该注意它们总是返回*arrays*,这与sugar.js和underscore.js的行为不同,它们默认只返回请求的元素,如果指定了`n`,则只返回一个数组(即使`n`等于1).因此,我建议你用以下内容替换它们:`Array :: first?=(n) - > if n?然后@splice 0,n else @ [0]`和`Array :: last?=(n) - >如果n?然后@splice(如果n> = @length,那么0 else @length - n)else @ [@ length-1]`. (2认同)

小智 13

最短的路在这里
array[-1..]
看这个帖子
https://github.com/jashkenas/coffee-script/issues/156

  • 我赞成这一点,虽然这会给你一个包装在一个新数组中的数组的最后一个元素.正确的代码应该是`array [-1 ..] [0]` (12认同)

小智 6

你可以使用:

[..., last] = array
Run Code Online (Sandbox Code Playgroud)

  • 这是自我解释的. (4认同)