我有一个已排序的数组,我在服务器将它们添加到我时添加元素。我遇到的麻烦是确定放置新元素的位置,然后将其放在同一个循环中
在javascript中看起来像这样
for(var i = 0; i < array.length; ++i){
if( element_to_add < array[i]){
array.splice(i,0,element_to_add);
break;
}
}
问题是在咖啡脚本中我没有访问计数器,所以我不能告诉它将我的数组拼接在所需的索引上。
如何在CoffeeScript中向已排序的数组中添加元素?
答案 0 :(得分:5)
默认的for
循环也会返回索引:
a = [1, 2, 3]
item = 2
for elem, index in a
if elem >= item
a.splice index, 0, item
break
您可能希望进行二进制搜索。
答案 1 :(得分:2)
如果您正在使用Underscore.js(非常推荐用于这些类型的数组操作),_.sortedIndex
会返回一个值应插入数组以保持其有序的索引,这样可以非常方便:
sortedInsert = (arr, val) ->
arr.splice (_.sortedIndex arr, val), 0, val
arr
如果你没有使用下划线,那么制作你自己的sortedIndex
也不是那么难;基本上是二进制搜索(如果你想把它的复杂性保持为O(log n)):
sortedIndex = (arr, val) ->
low = 0
high = arr.length
while low < high
mid = Math.floor (low + high) / 2
if arr[mid] < val then low = mid + 1 else high = mid
low
答案 2 :(得分:0)
如果我理解正确,为什么不保存这个位置,
var pos=-1;
for(var i = 0; i < array.length; ++i){
if( element_to_add < array[i]){
pos=i; break;
}
}
if(pos<0)
array.push(element_to_add);
else array.splice(pos,0,element_to_add);