2016-12-07 1 views
1

면책 조항 : 저는 초보 프로그래머이며 저에게 제 코드를 쓸 사람을 찾고 있지 않습니다. 내 필요에 맞게 수정할 수있는 포인터 또는 예제를 찾고 있습니다. 누군가가 나를 위해 모든 일을한다면 어떻게 다른 것을 배울 것인가? =)2d 배열에서 앞뒤로 이동

문제 :

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

내가 다음에 한 행에서 배열을 통해 이동해야 : 나는 다음과 같은 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' 변수는 숨겨져 있으므로이 정확한 코드를 사용하여 변수를 가져올 방법이 없습니다. 얻을 수있는 것은 현재 행, 즉'인덱스 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

은 "그것에 대해 생각하는 방법"질문은 내가 가장 좋아하는 사람은, 그래서 상세 사면.

내가 이와 같은 것을 설정할 때마다 먼저 언어와 같은 로직의 일부가 아닌 세부 사항에 관계없이 정말 순진한 방식으로 시도합니다. 문제를 명확하게 이해하고 시작하면 구현 준비가되었을 때 유용한 코드 샘플을 식별 할 수 있습니다.

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 ] ]; 

위의 코드는 여전히 거의을해야하지만 당신은 (할 몇 가지 더 많은 작업과 테스트가 : 그리드는 다음과 같이 할 수있는 경우 (비 고유 한 행 발스, 중복, 고르지 행 등을 참고) 더 많이 또는 덜 트릭). 처음에는 그것을 밖으로 스케치하고 논리와 가드를 확인한 다음 코드로갑니다.