bugfix> javascript > 投稿

配列の後ろから項目を取得しようとしています。関数は、ループ内の値を出力する必要があります。下の画像では、パターンに2つのアイテムが欠けていることがわかります。

期待される結果

//24,25,26,27,28,29,30
//17,18,19,20,21,22,23
//10,11,12,13,14,15,16
//3,4,5,6,7,8,9
//1,2,26,27,28,29,30

5および9配列の長さは7ではありません。5番目の配列には値が必要です。 [1,2,26,27,28,29,30] または [26,27,28,29,30,2,1] 。 同じパターンを9つの数値配列に適用する必要があります。

試してみましたが、解決策が見つかりませんでした。フィドル

	// Setup
var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30];
var arrIndex = 30;
var values
function getValues(length) {
    arrIndex = arrIndex - length;
    
    if(arrIndex<0){
      arrIndex = arr.length - Math.abs(arrIndex)
      values = arr.slice(arrIndex, arrIndex+length)
    }
    else{
        values = arr.slice(arrIndex, arrIndex+length)
    }
    var valuesCount = values.length;
    return values;
}
// Get the values
for (var i = 0; i < 10; i++) {
    console.log( getValues(7) );
}

配列の先頭から項目を取得している場合、正常に動作するコードを次に示します。フィドル

回答 2 件
  • @carlos、以下の解決策を試してください、

    問題は、ここでは(Array.slice)関数です。

    30の配列があります[配列のインデックスは0〜29のみ有効です]。 つまり、var arr = [1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、22、23 、24、25、26、27、28、29、30];

    var arrIndex = 30を使用すると、その時点で;ループごとに、Array(5)の値はインデックス25から始まり、配列の長さは7です。

    したがって、ここでは、代わりに31である25 + 7から値をフェッチしようとします(FYI、31はインデックスです)。

    したがって、値= arr.slice(25,31)。知っているように、30と31のインデックスはありませんvar arr 配列5の値にも間違いなく存在します。

    そのため、ここでは解決策として、スライス配列のendIndexが存在しない場合、残りの要素を取得するためにOインデックスから再度起動する必要があります。だからあなたはいくつのインデックスが欠落しているかを調べる必要がありますか? [ここではカウント= 2]ですので、そのカウントを防止し、配列のスライスを(0、cnt)から取得する必要があります。最後に、元の配列を次の配列と連結する必要があります(つまり、0から開始します)

    これを解決するために、ロジックが書かれています

     if (arrIndex < 0) {
        arrIndex = arr.length - Math.abs(arrIndex)
        var otherVal = 0;
        if (arrIndex + length >= arr.length) {
          otherVal = (arrIndex + length) - arr.length;
          values = arr.slice(arrIndex, arr.length)
        }
        if (otherVal > 0) {
          values = values.concat(arr.slice(0, otherVal))
        }
    
    

    したがって、最終出力は以下のようになります。

    // Setup
    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30];
    var arrIndex = 30;
    var values
    function getValues(length) {
      arrIndex = arrIndex - length;
      if (arrIndex < 0) {
        arrIndex = arr.length - Math.abs(arrIndex)
        var otherVal = 0;
        if (arrIndex + length >= arr.length) {
          otherVal = (arrIndex + length) - arr.length;
          values = arr.slice(arrIndex, arr.length)
        }
        if (otherVal > 0) {
          values = values.concat(arr.slice(0, otherVal))
        }
      } else {
        values = arr.slice(arrIndex, arrIndex + length)
      }
      var valuesCount = values.length;
      return values;
    }
    // Get the values
    for (var i = 0; i < 10; i++) {
      console.log(getValues(7));
    }
    
    

  • 非常に興味深い要件がありますが、チャレンジは受け入れられました:)

    const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30];
    function getValues(length) {
      const values = [];
      let temp = [];
      for (let i = arr.length - 1; i >= 0; i -= 1) {
        temp.unshift(arr[i]);
        if (temp.length === length) {
          values.push(temp);
          temp = [];
        }
      }
      if (temp.length > 0) {
        for (let i = arr.length - length + temp.length; i < arr.length; i += 1) {
          temp.push(arr[i]);
        }
        values.push(temp);
      }
      return values;
    }
    const values = getValues(7);
    for (let i = 0; i < values.length; i += 1) {
      console.log(values[i]);
    }
    
    

    ここで何が起こっているのか、配列を逆方向にループし、 unshift を使用しています  配列の先頭に値を配置して一時的な配列を作成します。 length を収集するとき  配列の量、その配列を別の配列にプッシュし、指定された length で配列の配列を作成します   getValues に渡される値  関数。

    ループの最後で、一時配列に何かが含まれている場合、それは length の配列の作成を完了できなかったことを意味します  ループの最後の残りのアイテムのサイズ。したがって、残りの量の配列の最後に移動し、一時配列を終了して、長さ length の最終配列を作成します  それを最終的な values にプッシュします  配列の配列。

あなたの答え