2

ソートされた配列があり、サーバーから渡されたときに要素を追加します。私が抱えている問題は、新しい要素をどこに配置するかを決定し、それを同じループに配置することです

JavaScriptでは、これは次のようになります

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

問題は、コーヒースクリプトではカウンターにアクセスできないため、目的のインデックスで配列をスプライスするように指示できないことです。

CoffeeScriptでソートされた配列に要素を追加するにはどうすればよいですか?

4

3 に答える 3

5

デフォルトのforループもインデックスを返します。

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

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

代わりにバイナリ検索を実行することをお勧めします。

于 2013-06-05T01:36:53.740 に答える
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
于 2013-06-05T02:30:21.687 に答える
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);
于 2013-06-05T01:29:55.293 に答える