6

私が持っているとしましょう:

var array = [0,1,2,3,4,5,6,7,8,9]

私は次のように定義します。

var itemsToExtract  = 5
var startindex = 7
var direction = "forward"

私はできるようにしたい:

array.someMethod(startindex, itemsToExtract, direction)

そして得る

[7,8,9,0,1]

方向を「後方」(右から左へのスライス) に設定すると、逆方向にも動作するようにします。

私はあまりにも怠け者ではなく、すでに何かを試しました。ここを参照してください: http://jsfiddle.net/MkNrr/

もしあれば「よりきちんとした」ものを探しています。また、このメソッドの名前はありますか?それは既知の問題ですか?

背景: イメージ ギャラリーで使用するために、シーケンシャル プリ イメージ ローダー (イメージ (src) を次々にロード) を構築しようとしています。たぶん、そのようなライブラリはすでに存在しますか?

4

6 に答える 6

1

前方配列と後方配列を返す関数はどうですか? そうすれば、スイッチは必要ありません。このようなもの:

function overslice(arr, idx, items) {

  var fwd = arr.filter(function(v,i){ return i >= idx }).slice(0, items),
      back = arr.filter(function(v,i){ return i <= idx }).slice(-items);

  while (fwd.length < items) {
    fwd = fwd.concat(arr).slice(0, items);
  }

  while (back.length < items) {
    back = arr.concat(back).slice(-items);
  }

  return { fwd: fwd, back: back };
}

次に、次のように使用できます。

var array = [0,1,2,3,4,5,6,7,8,9]
var result = overslice(array, 7, 5);

console.log(result.fwd, result.back); //=> [7, 8, 9, 0, 1] [3, 4, 5, 6, 7] 
于 2013-07-25T07:08:23.057 に答える
0

無効な位置をフィルター処理するために、いくつかの検証を追加します。これを行わないと、コードはさらに短くなります。

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
var countToExtract = 10
var whereToBegin = -1
var direction = "backword"

function overslice(array, startIndex, count, direction) {
    var retArray = [];
    var step = direction == "backword" ? -1 : 1;
    var startPos = (startIndex + array.length) % array.length;
    var endPos = (startPos + (count % array.length) * step + array.length) % array.length;

    for (var i = 0; i < count; i++) {
        var pos = (startPos + (i * step) % array.length + array.length) % array.length;
        retArray.push(array[pos]);
    }
    return retArray;
}

var lampa = overslice(arr, whereToBegin, countToExtract, direction)

alert(lampa)

上記のコードを使用すると、次のことができます。
マイナスの位置から開始し、反対側の端から逆算します。
count は配列の長さよりも長くなる可能性があるため、数値が繰り返し返されます。

于 2013-07-25T07:27:53.740 に答える
0

こんにちは、このコードを試してください。

function myslice( ar , start , count , dir ) {

    dir = dir || 'F';

    var out = [] ,
        times = Math.ceil( ( start + count )/ ar.length  ) + 1;

    while( times-- ) {
        [].push.apply( out, ar );
    }

    if ( dir == 'B' ) {
        start = ar.length - start - 1;
        out = out.reverse() ;
    }

    return out.slice( start  , start+count );
}

myslice ( [0,1,2,3,4,5,6,7,8,9] , 7 , 5 , 'B' );
于 2013-07-25T07:35:00.363 に答える
0

それほど多くはありませんが、うまく見えますJS Bin :

function overSlice(arr, start, count, dir){
  if(dir==='backward'){
      arr = arr.reverse();
      start = arr.length-start-1;
  }
   var lastIndex = start+count;
  return arr.slice(start,  lastIndex>arr.length?arr.length: lastIndex)
  .concat(arr.slice(0,  lastIndex>arr.length?lastIndex-arr.length: 0));
}

var arr = [0,1,2,3,4,5,6,7,8,9];
alert(overSlice(arr,7,5,'backward'));
于 2013-07-25T06:43:03.627 に答える
0

配列のコピーを作成し、十分な長さになるまで元の配列を追加するだけです。

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
var start = 7
var count = 5
var tmparr = arr

while (tmparr.length < start + count) {
   tmparr = tmparr.concat(arr);
}

var result = tmparr.slice(start, start + count);

alert(result);
于 2013-07-25T06:43:20.460 に答える