2013-06-05 40 views
2

我有一个有序数组,我随着服务器给我的元素添加元素。我遇到的麻烦是确定在哪里放置我的新元素,然后将其放置在同一回路将元素添加到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中的排序数组?

+0

你现在如何遍历数组? – Blender

+0

'对于数组中的元素',我也尝试在back-ticks中敲击一些平面javascript代码,但它一直在编译时返回'return' infront – Loourr

+0

假设你的数组没有反向排序,那代码是错误的 - 它插入元素就在第一个位置。它插入后忘记打破,所以它会永久循环。 – Bergi

回答

5

默认for环路返回索引以及:

a = [1, 2, 3] 
item = 2 

for elem, index in a 
    if elem >= item 
     a.splice index, 0, item 
     break 

您可能希望做一个二进制改为搜索。

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); 
2

如果您正在使用Underscore.js(非常建议对这些类型的数组操作的),_.sortedIndex,它返回在哪个值应该被插入到一个数组,以保持其订购的指标,可以来非常方便:

sortedInsert = (arr, val) -> 
    arr.splice (_.sortedIndex arr, val), 0, val 
    arr 

如果你不使用Underscore,那么制作你自己的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