【发布时间】:2012-07-17 00:40:10
【问题描述】:
如果说我有一个数组,我会遍历数组,但对第一个和最后一个元素做一些不同的事情。我该怎么做?
以下面的代码为例,如何提醒元素a和e?
array = [a,b,c,d,e]
for element in array
console.log(element)
谢谢。
【问题讨论】:
标签: arrays coffeescript
如果说我有一个数组,我会遍历数组,但对第一个和最后一个元素做一些不同的事情。我该怎么做?
以下面的代码为例,如何提醒元素a和e?
array = [a,b,c,d,e]
for element in array
console.log(element)
谢谢。
【问题讨论】:
标签: arrays coffeescript
你可以只使用:
[..., last] = array
【讨论】:
访问数组的第一个和最后一个元素的原始方法实际上与 JS 中的相同:使用索引 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 个元素。如果您不需要该功能,那么实现会简单得多(基本上只是 else 分支)。
更新 2
CoffeeScript >= 1.7 让你写作:
[first, ..., last] = array
不使用中间元素生成不必要的数组:D
【讨论】:
first 和 last 原型方法优雅且有用,但应该注意它们总是返回 arrays,这与 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]。
Array#slice 而不是Array#splice 以避免修改原始数组。
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]
Math.max 可以帮助避免使用嵌套的ifs,并且会为max 和min 产生一个相当对称的实现,所以就是这样:)
您可以使用带有 splat 的数组 destructuring 来检索第一个和最后一个元素:
[first, ..., last] = array
CoffeeScript >= 1.7.0 支持这种 splat 用法。
【讨论】:
[first, ..., last] = array,它不会生成不必要的 Array#slice 调用:D
最短的方法在这里array[-1..]
看到这个帖子
https://github.com/jashkenas/coffee-script/issues/156
【讨论】:
array[-1..][0]
您可以使用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 的 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
【讨论】: