在二维阵列中前后移动

时间:2016-12-07 12:37:20

标签: javascript arrays multidimensional-array

免责声明:我是一名新手程序员,我不是在找人为我编写代码。我正在寻找可以修改以满足我需求的指针或示例。如果有人为我完成所有工作,我还能学到什么。 :=)

问题:我有一个类似于以下内容的二维数组:

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

我需要从一行到下一行遍历数组。 (我将对该行进行更改。我已经编写了该代码并且可以正常工作)。

我找到了以下代码,它应该允许我遍历数组。前进(下一行),后退(前一行)和当前位置。

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();

有人可以指出我在哪里出错吗?

2 个答案:

答案 0 :(得分:1)

我建议保留cur,我将index重命名为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; }
Slot

答案 1 :(得分:0)

&#34;如何思考&#34;问题是我最喜欢的,所以请原谅冗长。

每当我设置这样的东西时,我首先尝试以一种非常天真的方式进行,而不依赖于实际上不属于逻辑的细节(如语言)。如果您从清楚地理解问题开始,那么当您准备好实施时,您将能够更好地识别有用的代码示例。

让我们澄清&#34;行&#34;就2d网格而言。您提供以下代码:

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

让它沸腾下来。 g是&#34; grid&#34;,r是&#34; row&#34;,c是&#34; column&#34;:

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

很容易看到那里发生了什么。然后你说,&#34;向前走过行#34;我认为这意味着你想从一个给定的行开始,然后前进或回到下一行/前一行(请注意,ES6有一些有趣的方法来做这种事情,没有附加的库,&#34;迭代器&#34)。

这里有一些非常天真的代码草图(有更多功能/优雅的方法可以做到这一点,但同样的实现细节,我不确定你对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],您的新导航行现在是网格[newIndex]

请注意,通过这种方式,您可以避免在继续导航时使用类或全局级别变量来跟踪索引。 newIndex只是你的startIndex(嗯...递归...生成器/收益?有趣......)。无论如何,这很好。

同样,非常天真,但到现在为止,您可能会看到主要涉及移动简单网格,并且可能自己设置代码。

注意:此代码假设一个非常天真的网格。如果你的网格看起来像这样(注意非唯一的行val,重复,不均匀的行等):

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

然后你还有更多的工作和测试要做(虽然上面的代码应该或多或少地做了)。首先草拟它,检查你的逻辑和警卫,然后去代码。