은 "그것에 대해 생각하는 방법"질문은 내가 가장 좋아하는 사람은, 그래서 상세 사면.
내가 이와 같은 것을 설정할 때마다 먼저 언어와 같은 로직의 일부가 아닌 세부 사항에 관계없이 정말 순진한 방식으로 시도합니다. 문제를 명확하게 이해하고 시작하면 구현 준비가되었을 때 유용한 코드 샘플을 식별 할 수 있습니다.
2 차원 격자로 "행"을 명확히 해봅시다. 당신은이 코드를 제공합니다 :
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는 add-on libs가없는 이런 종류의 일을하는 흥미로운 방법을 가지고있다. "iterators") .
(이이 일을 더 많은 기능/우아한 방법이 있지만, 다시는 구현 세부 사항 그리고 내가 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를이 방법을 수행하여 o 계속해서 탐색 할 때 색인을 추적하기 위해 클래스 또는 전역 레벨 변수를 사용하지 않아도됩니다. newIndex가 startIndex가됩니다 (재귀 ... 생성자/수익률? 흥미 롭습니다 ...). 어쨌든, 좋습니다.
다시 한번 말하지만, 지금까지는 간단한 그리드를 움직이는 원리를 보았을 것입니다. 아마도 코드를 스스로 설정할 수 있습니다.
참고 :이 코드는 매우 순진한 것으로 가정합니다. 그런 다음
[ [ undefined, 0, '' ], undefined, [ 1, 2, 3 ], [ 1, 1, 2, 3, 4, 5 ] ];
위의 코드는 여전히 거의을해야하지만 당신은 (할 몇 가지 더 많은 작업과 테스트가 : 그리드는 다음과 같이 할 수있는 경우 (비 고유 한 행 발스, 중복, 고르지 행 등을 참고) 더 많이 또는 덜 트릭). 처음에는 그것을 밖으로 스케치하고 논리와 가드를 확인한 다음 코드로갑니다.
인덱스가 범위를 벗어나는 경우'curr' 인덱스는 어떻게 될까요? 내부에 머물면서 밖에 머무르며 값을 유효하게 유지할 것인가? –
초보자는이 코드를 사용하지 말 것을 권장합니다. 그것은 일을 쉽게하려고하지만, 오도하는 것입니다. 'cur' 변수는 숨겨져 있으므로이 정확한 코드를 사용하여 변수를 가져올 방법이 없습니다. 얻을 수있는 것은 현재 행, 즉'인덱스 cur' 행입니다. 자신의 코드를 작성하고, 직접 변수를 생성하고, 루프를 사용하여 루프를 증가 시키십시오. – Tiago
원하는 것을 이해하지 못합니다. 예상되는 결과를 추가하십시오. –