从 CoffeeScript 中的数组中删除一个值

Posted

技术标签:

【中文标题】从 CoffeeScript 中的数组中删除一个值【英文标题】:Remove a value from an array in CoffeeScript 【发布时间】:2012-01-02 14:12:09 【问题描述】:

我有一个数组:

array = [..., "Hello", "World", "Again", ...]

如何检查“世界”是否在数组中? 如果存在则删除它? 并提到“世界”?

有时我想用一个正则表达式匹配一个单词,在这种情况下我不知道确切的字符串,所以我需要一个对匹配字符串的引用。但在这种情况下,我确定是“世界”,这使它更简单。

感谢您的建议。我找到了一个很酷的方法:

http://documentcloud.github.com/underscore

【问题讨论】:

***.com/questions/4825812/… 【参考方案1】:

filter() 也是一个选项:

arr = [..., "Hello", "World", "Again", ...]

newArr = arr.filter (word) -> word isnt "World"

【讨论】:

重要区别:此解决方案没有破坏性,即arr 将保持不变(这通常是良好的功能实践)。与已接受的答案进行比较,这是具有破坏性的。 在问题中,他要求引用“世界” 请注意(很尴尬)这是空间敏感的; arr.filter(word) -> word isn't "Word" 生成一个 javascript 错误。 @ashes999 实际上并没有那么尴尬。你写的在语法上是错误的。 arr.filter (word) -> word isn't "Word" 表示“使用(word) -> word isn't "Word" 函数参数执行过滤函数”【参考方案2】:

array.indexOf("World") 将获得"World"-1 的索引(如果它不存在)。 array.splice(indexOfWorld, 1) 将从数组中删除 "World"

【讨论】:

以下解决方案提供更好的咖啡脚本语法。但是,如果您只需要从数组中删除一个元素,则此工作流具有更好的性能,因为它不会遍历整个数组以寻找具有相同值的更多元素。 @ErikJ:“更好”的 CoffeeScript 语法? @ryanh:你说得对,更好不是正确的词,但其他人提供了利用 CoffeeScript 特定功能的替代方案【参考方案3】:

由于这是一种很自然的需求,我经常使用remove(args...) 方法对我的数组进行原型设计。

我的建议是写在某处:

Array.prototype.remove = (args...) ->
  output = []
  for arg in args
    index = @indexOf arg
    output.push @splice(index, 1) if index isnt -1
  output = output[0] if args.length is 1
  output

在任何地方都可以这样使用:

array = [..., "Hello", "World", "Again", ...]
ref = array.remove("World")
alert array # [..., "Hello", "Again",  ...]
alert ref   # "World"

这样你也可以同时移除多个项目:

array = [..., "Hello", "World", "Again", ...]
ref = array.remove("Hello", "Again")
alert array # [..., "World",  ...]
alert ref   # ["Hello", "Again"]

【讨论】:

splice 返回一个数组,所以应该是@splice(index,1)[0] 如果它已经被拒绝,我会使用?= 来避免覆盖它。【参考方案4】:

检查“世界”是否在数组中:

"World" in array

如果存在则删除

array = (x for x in array when x != 'World')

array = array.filter (e) -> e != 'World'

保留参考(这是我发现的最短的 - !.push 始终为假,因为 .push > 0)

refs = []
array = array.filter (e) -> e != 'World' || !refs.push e

【讨论】:

【参考方案5】:

试试这个:

filter = ["a", "b", "c", "d", "e", "f", "g"]

#Remove "b" and "d" from the array in one go
filter.splice(index, 1) for index, value of filter when value in ["b", "d"]

【讨论】:

从数组中删除倒数第二项时,这不会按预期工作。见jsfiddle.net/8v25L【参考方案6】:

几个答案的组合:

Array::remove = (obj) ->
  @filter (el) -> el isnt obj

【讨论】:

【参考方案7】:

underscorejs 库中的_.without() 函数是一个很好且干净的选项,以防您想获得一个新数组:

_.without([1, 2, 1, 0, 3, 1, 4], 0, 1)
[2, 3, 4]

【讨论】:

【参考方案8】:

CoffeeScript + jQuery: 删除一个,而不是全部

arrayRemoveItemByValue = (arr,value) ->
  r=$.inArray(value, arr)
  unless r==-1
    arr.splice(r,1)
  # return
  arr

console.log arrayRemoveItemByValue(['2','1','3'],'3')

【讨论】:

以上是关于从 CoffeeScript 中的数组中删除一个值的主要内容,如果未能解决你的问题,请参考以下文章

Coffeescript / Node.js:如何从对象数组中删除重复对象?

从 javascript 数组中删除元素的干净方法(使用 jQuery、coffeescript)

在多维数组javascript或coffeescript中获取最大值

在 CoffeeScript 中,如何将值附加到数组?

如何从 PHP 中的数组中删除值?

coffeescript:遍历数组中的对象