2016-12-07 6 views
1

免責事項:私は初心者プログラマーであり、私のコードを書く人を探しているわけではありません。私は私のニーズに合うように修正できるポインタや例を探しています。もし誰かが私のためにすべての仕事をしたら、他にどのように私は学ぶでしょう。 :=)2次元配列で前後に移動

問題:

var myArray = [["pat", "tom" , "john"], ["sam", "toby", "barbra"],["william","jack", "janice"]]; 

Iは、ある行から次の行に配列を移動する必要があります。私は、次のような2次元配列を有します。 (私は行を変更しています。私は既にそのコードを書いていますし、動作します)。

私は次のコードを見つけました。そして、私は配列を移動することができます。前方(次の行)、後方(前の行)、現在の場所に移動します。

var iterifyArr = function (arr) { 
var cur = 0; 
arr.nextRecord = (function() { return (++cur >= this.length) ? false : this[cur]; });// move to the next row of array 
arr.prevRecord = (function() { return (--cur <= this.length) ? false : this[cur]; });//move to previous row of array 
arr.cur = (function() { return this[cur]; }); 
return arr; 
}; 
var myArray = [["pat", "tom" , "john"], ["sam", "toby", "barbra"],["william","jack", "janice"]]; 
iterifyArr(myArray); 

次のコードを使用して現在の位置を取得しようとすると、行番号自体ではなく行の最後の位置が取得されます。

var currentpos = myStack.cur(); 

誰かが私にこれについて間違っていると指摘していただけますか?

+0

インデックスが範囲外になる場合、 'curr'インデックスはどうなるべきですか?内部に滞在し、外にとどまり、価値を有効に保ちますか? –

+0

初心者でも、このコードを使用することをお勧めします。物事を簡単にしようとするが、それは誤解を招く。 'cur'変数は隠されており、この正確なコードを使用する方法はありません。あなたが得ることができるのは、現在の行、つまり、 '' index cur''を持つ行です。独自の変数を作成し、ループを使用してインクリメントしたり、独自のコードを書き込んでみてください。 – Tiago

+0

何が欲しいのか分からないので、期待した結果を加えてください。 –

答えて

1

私はに有効な場所で名前を変更したcurを保管することをお勧めします。これは、増減前のチェックを意味します。

function iterifyArr(arr) { 
 
    var index = 0; 
 

 
    arr.nextRecord = function() { 
 
     return index + 1 < this.length && this[++index]; 
 
    }; 
 

 
    arr.prevRecord = function() { 
 
     return index >= 1 && this[--index]; 
 
    }; 
 

 
    arr.currentRecord = function() { 
 
     return this[index]; 
 
    }; 
 

 
    arr.getIndex = function() { 
 
     return index; 
 
    }; 
 

 
    return arr; 
 
}; 
 

 
var myArray = [["pat", "tom", "john"], ["sam", "toby", "barbra"], ["william", "jack", "janice"]]; 
 
iterifyArr(myArray); 
 

 
console.log(myArray.nextRecord()); 
 
console.log(myArray.nextRecord()); 
 
console.log(myArray.nextRecord()); 
 
console.log(myArray.currentRecord()); 
 
console.log(myArray.getIndex());
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

' .as -console-wrapper 'ほとんどのあなたの答え:) –

+1

@Reddy、ちょうどそれを追加してください...意味があれば。 –

0

「それについて考える方法」の質問は、私が一番好きなものはあるので、冗長性を容赦。

このようなものを設定するときは、まずロジックの一部ではない詳細(言語のようなもの)とは無関係に、本当に素朴な方法でそれをやろうとします。問題をはっきりと理解することから始めれば、実装する準備が整った時点で有用なコードサンプルを識別することができます。

2dグリッドで「行」を明確にしましょう。あなたはこのコードを提供しています:

var myArray = [["pat", "tom" , "john"], ["sam", "toby", "barbra"], 
       ["william","jack", "janice"]]; 

それを煮沸しましょう。 gは「グリッド」、rは「行」、cは「列」です。

g = r1 (c1, c2, c3) 
    r2 (c1, c2, c3) 
    r3 (c1, c2, c3) 

かなりうまくいくのが見えます。次に、 "行を通って進む"と言う。私はあなたが特定の行から始めたいと思うことを意味し、次に進む/前の行に進みます(ES6には、アドオンライブラリなしのこのようなことを行う興味深い方法があります。 。

(そこにこれを行うのがより機能的/エレガントな方法がありますが、再びそれは実装の詳細だと私はJSであなたの全体的な親しみのかわからない)ここにスケッチいくつかの非常にナイーブコード:今まで

// let's assume first you need to find a row in your grid by a value. 
// Note we just need the index of the row, not the row itself. 
// You could skip this for first/last row, since 
// first would just be 0, last would be grid.length - 1 
var findRow = function (val) { 
    grid.forEach (function (row, row_i) { 
     if (row.find (val) { 
     return row_i; 
     } 
    } 
} 

// now navigate through rows 
// we will use 0 and 1 as valid vals for "next" and "previous" 
// You could also add "next" and "prev" functions that just feed 
// this function 0 and 1, etc. 
var navRow = function (row_num, direction) { 
    // guard against a bad direction 
    var validDirections = [ 0, 1 ]; 
    if (! validDirections.find (direction)) { 
    console.log ('bad direction!!!') { 
    return; 
    } 

    // guard against an out-of-bounds row number 
    if (! (row_num >= 0 && row_num < grid.length)) { 
    console.log ('bad row num!!!'); 
    return; 
    } 

    // if all that checks out, compute the target row. 
    // note that we allow for wrapping. 
    // direction is either 0 or 1, so we can just use a falsy check 
    if (direction) { 
    row_num++; 
    } else { 
    row_num--; 
    } 

    // check to make sure the new row number isn't out of bounds, 
    // if it is, wrap it 
    if (row_num < 0) { 
    row_num = grid.length - 1; 
    } else if (row_num >= grid.length) { 
    row_num = 0; 
    } 

    // return the index 
    return row_num; 
} 

使用:

var startIndex = findRow ('janice'); 
// Note that startIndex may be undefined if no row is found! 
// Will assume you guard against that. 
var newIndex = navRow (startRow, 0); // go back, or wrap to end 
var newIndex = navRow (startRow, 1); // forward, or wrap to start 

あなたの開始行が[中START_INDEX]、新しくnav'd行は、今ではこのようにそれをやっていること[newIndexが]

注意、yのグリッドであるグリッドましたあなたがナビゲートし続けるときにインデックスを追跡するためにクラスまたはグローバルレベルの変数を使用する必要はありません。 newIndexはちょうどあなたのstartIndex(hmm ... recursion ... generator/yield?Interesting ...)になります。とにかく、それは良いです。

これまでのところ、単純なグリッドの周りを動く原理を見ているかもしれませんが、おそらく自分でコードを設定することができます。

注:このコードでは、非常に素朴なグリッドを前提としています。その後

[ [ undefined, 0, '' ], undefined, [ 1, 2, 3 ], [ 1, 1, 2, 3, 4, 5 ] ]; 

上記のコードはまだほとんど行う必要がありますけれども、あなたが(行うにはいくつかのより多くの作業とテストを持っている:あなたのグリッドは次のように見ることができる場合(非ユニーク行ヴァルス、重複、不均一な行、などの点に注意してください)トリックを多かれ少なかれ)。最初にそれをスケッチして、あなたのロジックとガードをチェックし、次にコードに行きます。