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

27

如果我有一个数组并且想要遍历该数组,但对第一个和最后一个元素执行不同的操作。我应该如何做?

以下面的代码为例,如何弹出元素ae

array = [a,b,c,d,e]
for element in array
  console.log(element)

谢谢。

6个回答

58

您可以使用带有展开运算符的数组解构来检索第一个和最后一个元素:

[first, ..., last] = array

使用splat语法需要CoffeeScript版本不低于1.7.0。


1
请注意,在 CoffeeScript 的版本大于1.7的情况下,您可以编写 [first, ..., last] = array,它将不会生成不必要的 Array#slice 调用 :D - epidemian

24

访问数组的第一个和最后一个元素的基本方法与JavaScript相同:使用索引0length - 1


console.log array[0], array[array.length - 1]

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

[first, mid..., last] = array
console.log first, last

如果你不打算使用中间元素,那我觉得这样做并不值得。

Underscore.js有一些辅助方法firstlast,可以使代码更加符合英语语法(我不想使用诸如“不言自明”之类的短语,因为我认为任何程序员都会理解数组索引)。如果您不想使用Underscore并且不介意污染全局命名空间(这就是其他库,如Sugar.js的做法),则可以轻松添加到Array对象中:

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()

更新

这些函数还允许你获取数组中的前n个或后n个元素。如果你不需要这个功能,那么实现会简单得多(基本上只有else分支)。

更新2

CoffeeScript > = 1.7 让你可以这样写:

[first, ..., last] = array

避免生成一个不必要的包含中间元素的数组 :D


2
虽然你的 firstlast 原型方法很优雅且有用,但需要注意的是它们总是返回 数组,这与 sugar.js 和 underscore.js 的行为不同,后者默认仅返回所请求的元素,并且仅在指定了 n(即使 n 等于 1)时才返回数组。因此,我建议你用以下代码替换它们:Array::first ?= (n) -> if n? then @splice 0, n else @[0]Array::last ?= (n) -> if n? then @splice (if n >= @length then 0 else @length - n) else @[@length-1] - mklement0
1
感谢@mklement0!我完全忘记了只返回第一个或最后一个元素的简单情况:(。根据您的评论,我更新了答案,但使用了Array#slice而不是Array#splice来避免修改原始数组。 - epidemian
感谢您更新帖子并纠正了splice/slice混淆的问题。还有一个可能有意义的微调:排除负索引:Array::first ?= (n) -> if n? then (if n <= 0 then [] else @slice 0, n) else @[0]Array::last ?= (n) -> if n? then (if n <= 0 then [] else @slice -n) else @[@length-1] - mklement0
@mklement0,完成(y)。我本来考虑不要让实现变得更加复杂,但是后来想到使用Math.max可以避免使用嵌套的if语句,并且会为maxmin提供相当对称的实现,所以就这样 :) - epidemian

13

12
我赞同这个观点,尽管这将为您提供包装在新数组中的数组的最后一个元素。正确的代码应该是 array[-1..][0] - drinchev
1
它现在是错误的。按照drinchev的建议进行更新将值得一次点赞。 - Tyler Collier

6

您可以只使用:

[..., last] = array

1
请编辑您的答案,并解释为什么这是一个好的解决方案。 - Ben
4
这很容易理解。 - Dan

4
您可以使用slice方法获取最后一个元素。在JavaScript中,slice方法可以将负数(如-1)作为参数传递。
例如:
array = [1, 2, 3 ]
console.log "first: #{array[0]}"
console.log "last: #{array[-1..][0]}"

编译成

var array;
array = [1, 2, 3];
console.log("first: " + array[0]);
console.log("last: " + array.slice(-1)[0]);

2

使用Coffeescript的for...in循环遍历数组时,您可以获取当前elementindex。请参见以下代码,将special_process_for_elementnormal_process_for_element替换为您的代码。

array = [a, b, c, d]
FIRST_INDEX = 0
LAST_INDEX = array.length - 1

for element, index in array
    switch index
        when FIRST_INDEX, LAST_INDEX
            special_process_for_element
        else
            normal_process_for_element
可工作的代码。此代码演示了如何在CoffeeScript中迭代数组并在每个元素上执行特定操作,这里是一个简单的例子:对于第一个和最后一个元素,执行一种特殊的操作;对于其他元素,执行常规操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接