在CoffeeScript中将元素添加到有序数组中

时间:2013-06-05 01:25:02

标签: javascript arrays coffeescript

我有一个已排序的数组,我在服务器将它们添加到我时添加元素。我遇到的麻烦是确定放置新元素的位置,然后将其放在同一个循环中

在javascript中看起来像这样

for(var i = 0; i < array.length; ++i){
   if( element_to_add < array[i]){
      array.splice(i,0,element_to_add);
      break;
   }
}

问题是在咖啡脚本中我没有访问计数器,所以我不能告诉它将我的数组拼接在所需的索引上。

如何在CoffeeScript中向已排序的数组中添加元素?

3 个答案:

答案 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);