2016-06-17 9 views
-2

私は配列を持っていて、その配列のサブ配列を反復処理する関数があるとします。さらに、サブアレイが配列の終わりを超えてインデックスを含む場合、サブアレイは配列の最初のインデックスで再開する。配列の長さが50で、インデックスは0から始まり、特に配列インデックスが任意の終点と始点の間にあるかどうかをテストするには?

48 49 0 1 ... 

場合

例えば、私は最後から先頭に取得するためにはJavaScriptの剰余演算子を使用しています。 array[i%array.length]

これは私に必要なインデックスの連続セットを取得しますが、インデックス値に基づいていくつかのフィルタリングを行いたいと思っています。たとえば、48と1の間のインデックスのみを保持する。終わりを除いて、開始のために含めてください。

私がやっていたことは、単にitem.index >= idx && item.index < endのような条件でフィルタリングしていましたが、これは明らかに配列の先頭と最後では機能しません。

タイトルが示すように、特定のインデックスまたはインデックスのセットがこれらのポイントの間にあるかどうかを効率的にチェックするにはどうすればよいですか?

この質問の目的のために、開始点は両端を含み、終了点は排他的です。

編集:downvotesに応答して、私は質問を明確にし、いくつかのスニペットを追加しました。私は、簡潔さのために問題の各詳細を省略しています。

+0

次の2つの他の要素の間にある要素とはどういう意味ですか? – nicael

+0

どのような状態であれ、どの点も他の点の間にあります。なぜなら、それぞれの点が後で再び来るからです。 –

+0

これは無限ループを作成しませんか?おそらく、なぜこれが必要なのか説明する必要があります。 – 4castle

答えて

0

を動作するはずです正しい方向には向いていませんでした。私の問題は明確に表現することが難しかったので、私はそれらを責めません。

将来の訪問者のために、私が心に留めていたことを達成したコードを以下に示します。

Plunkr demo

/* source array */ 
var source = []; 

for (var i = 0; i < 10; i++) { 
    source.push({ index: i }); 
} 

/* target array */ 
var target = []; 

/* initial index reference in the array; bound between 0 and length-1 */ 
var index = 0; 

/* count of items to be 'displayed', or allocated to the subarray; with index = 0, items 0,1,2,3 will be in the subarray */ 
var show = 3; 

/* init target */ 

target = source.slice(index,show); 

/* specifies count of items to be replaced when updating the subarray */ 
var increment = 1; 

var iterator = [1,2,3,4,5,6,7,8,9]; 

iterator.forEach(function(item,i) { 
    slide(increment); 
}); 

console.log('first index should be at index: ' + iterator.length, 'actual index is: ', target[0].index); 
console.log('last index should be at index: ' + (iterator.length + show - 1)%source.length, 'actual index is: ', target[target.length-1].index); 

function slide(by) { 

     if (!by) { 
     by = 1; 
     } 

     var len = source.length; 
     var idx; 

     if (index + by < 0) { 
     idx = len - Math.abs(by); 
     } else if (index + by >= len) { 
     idx = by; 
     } else { 
     idx = index + by; 
     } 

     var start = idx + show; 

     var i; 
     var j; 

     for (i = idx, j = 0; i < start; i++, j++) { 

     var loc = target.indexOf(source[i%len]); 

     if (loc >= 0) { 
      target[loc] = { index: null }; 
     } 

     target[j] = source[i%len]; 
     } 

     index = (idx) > len ? idx-len : idx; 

} 
0

条件の他のいくつかの種類がなければ、これは無限ループになりますが、しかし、ここでそれが行われることになる方法は次のとおりです。

for (var i = 1; someCondition; i++) { 
    if (i >= array.length - 1) { 
     i = 1; 
    } 
    // some code 
} 
+0

はい、私はこれらの行に沿って何かをすることができますが、あまりエレガントではありません。 – Jefftopia

+0

'for(var i = 0; condition; i = i> = array.length?0:i + 1) 'もっとエレガント?また、インクリメント部分に 'i =(i + 1)%array.length'を使用することもできますが、それはあなたが必要とするものよりも多くの計算量であり、パフォーマンスは低いです。 – 4castle

+0

私は自分の答えを編集して、最初と最後のインデックスを反復しないようにしました。 – 4castle

0

そのようなことが推奨的回答がでた

function checkPresence(arr, start, stop, value){ 
    if (arr.slice(arr.indexOf(start), arr.indexOf(stop)).indexOf(value) != -1) 
    return true; 
    else return false; 
} 

var tab = [12, 2, 36, 14, 48, 49, 0, 1]; 
console.log(checkPresence(tab, 48, 1, 49)); 
+0

アイテムのインデックスをソース配列のインデックスと比較しています。あなたは* numbers * 49、48、1のindexOfを見ていますが、私の場合はインデックスであり、1は決して49や48を超えません。 – Jefftopia

+0

オリジナルのArrayとサブアレイの例?私のために、配列はインデックスによって到達可能な値のセリフです。 –

関連する問題