如果我有一个数组并且想要遍历该数组,但对第一个和最后一个元素执行不同的操作。我应该如何做?
以下面的代码为例,如何弹出元素a和e?
array = [a,b,c,d,e]
for element in array
console.log(element)
谢谢。
如果我有一个数组并且想要遍历该数组,但对第一个和最后一个元素执行不同的操作。我应该如何做?
以下面的代码为例,如何弹出元素a和e?
array = [a,b,c,d,e]
for element in array
console.log(element)
谢谢。
访问数组的第一个和最后一个元素的基本方法与JavaScript相同:使用索引0
和length - 1
:
console.log array[0], array[array.length - 1]
CoffeeScript允许你编写一些漂亮的数组解构表达式:
[first, mid..., last] = array
console.log first, last
如果你不打算使用中间元素,那我觉得这样做并不值得。
Underscore.js有一些辅助方法first
和last
,可以使代码更加符合英语语法(我不想使用诸如“不言自明”之类的短语,因为我认为任何程序员都会理解数组索引)。如果您不想使用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
first
和 last
原型方法很优雅且有用,但需要注意的是它们总是返回 数组,这与 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]
。 - mklement0Array#slice
而不是Array#splice
来避免修改原始数组。 - epidemianArray::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]
。 - mklement0Math.max
可以避免使用嵌套的if
语句,并且会为max
和min
提供相当对称的实现,所以就这样 :) - epidemian最短的方式在这里
array[-1..]
查看此线程
https://github.com/jashkenas/coffee-script/issues/156
array[-1..][0]
。 - drinchev您可以只使用:
[..., last] = array
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]);
使用Coffeescript的for...in
循环遍历数组时,您可以获取当前element
和index
。请参见以下代码,将special_process_for_element
和normal_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中迭代数组并在每个元素上执行特定操作,这里是一个简单的例子:对于第一个和最后一个元素,执行一种特殊的操作;对于其他元素,执行常规操作。
[first, ..., last] = array
,它将不会生成不必要的 Array#slice 调用 :D - epidemian