免责声明:我是一名新手程序员,我不是在找人为我编写代码。我正在寻找可以修改以满足我需求的指针或示例。如果有人为我完成所有工作,我还能学到什么。 :=)
问题:我有一个类似于以下内容的二维数组:
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();
有人可以指出我在哪里出错吗?
答案 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 ] ];
然后你还有更多的工作和测试要做(虽然上面的代码应该或多或少地做了)。首先草拟它,检查你的逻辑和警卫,然后去代码。