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