「それについて考える方法」の質問は、私が一番好きなものはあるので、冗長性を容赦。
このようなものを設定するときは、まずロジックの一部ではない詳細(言語のようなもの)とは無関係に、本当に素朴な方法でそれをやろうとします。問題をはっきりと理解することから始めれば、実装する準備が整った時点で有用なコードサンプルを識別することができます。
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 ] ];
上記のコードはまだほとんど行う必要がありますけれども、あなたが(行うにはいくつかのより多くの作業とテストを持っている:あなたのグリッドは次のように見ることができる場合(非ユニーク行ヴァルス、重複、不均一な行、などの点に注意してください)トリックを多かれ少なかれ)。最初にそれをスケッチして、あなたのロジックとガードをチェックし、次にコードに行きます。
インデックスが範囲外になる場合、 'curr'インデックスはどうなるべきですか?内部に滞在し、外にとどまり、価値を有効に保ちますか? –
初心者でも、このコードを使用することをお勧めします。物事を簡単にしようとするが、それは誤解を招く。 'cur'変数は隠されており、この正確なコードを使用する方法はありません。あなたが得ることができるのは、現在の行、つまり、 '' index cur''を持つ行です。独自の変数を作成し、ループを使用してインクリメントしたり、独自のコードを書き込んでみてください。 – Tiago
何が欲しいのか分からないので、期待した結果を加えてください。 –