2012-04-05 6 views
2

안녕하세요. 일련 번호를 함수로 원래 숫자를 반환하는 배열로 변경해야하는 문제에 대해 작업하고 있습니다. 그래서 우리는 [2] 대신에 a2를 반환합니다.배열을 함수 배열로 변환하는 JavaScript

나는 대답을 원한다. 단지 힌트가 필요하다. 배열을 통해 반복 할 수 및 .pop() 배열의 마지막 값을 얻으려면 사용할 수 있지만 그 다음 거기에서 함수로 변환하는 방법을 몰라. 어떤 힌트?

+1

숙제 인 경우 태그로 지정해야합니다. 그것이 맞다면 괜찮습니다. 그냥 – rlemon

+2

이라는 태그를 붙이세요. 그 이유는 질문에 "과제물"태그가 붙어있는 경우 사이트 사용자는 완전한 해결책을 코딩하는 것이 올바른 방향으로 향하는 것처럼 바람직하지 않음을 알고 있습니다. – bernie

+1

좋은 지적 , 나는 그것을 정말로 고려하지 않았다. 팁을 주셔서 감사합니다, 잘하면 내 대답은 멀지 않고 약간의 지식을 추가하고 있습니다! (그렇지 않다면 알려주세요.) –

답변

1
var numToFun = [1, 2, 3]; 
var numToFunLength = numToFun.length; 

for (var i = 0; i < numToFunLength; i++) { 
    (function(num){ 
     numToFun.unshift(function() { 
      return num; 
     }); 
    }(numToFun.pop())) 
} 

DEMO

기본적으로 마지막 번호부터 번호가 튀어 나와 번호가 반환 된 함수가 만들어지고 배열의 첫 번째 자리에 다시 저장됩니다. 하나의 전체 사이클 후에, 그것들 모두는 기능이다. 여기

는 캐치 :이 어떻게 작동하는지,이 루프는 간단한 팝업 취소]처럼 보이지 않는 이유

조회 당신까지 : (힌트 :

for (var i = 0; i < numToFunLength; i++) { 
    numToFun.unshift(function() { //put into first a function 
     return numToFun.pop()  //that returns a number 
    }); 
} 

그리고 난 이런 짓을하는 이유 : 성능)

var numToFunLength = numToFun.length; 
0

편집 :이 권리를 수행하는 방법을 잘 설명하기위한의 다른 답변을 참조하십시오, 나는 또한 내 해결됩니다 다른 사람들이 지적했듯이

하지만, 그 많은 투쟁 자바 스크립트에서 까다로운 것들 중 하나 (자신을 포함됨, 분명히) javascript의 범위 지정 변수는 다른 많은 언어와 유사하지 않습니다. 범위는 함수에 의해 거의 순전히 정의되며, 예를 들어 for 루프의 {} 블록이 아니라 java/C가 정의됩니다.

그래서 아래에서 (와 다른 답변에서) 범위 지정 기능이 이러한 문제를 해결할 수 있습니다.

아래에있는 내 오래된 나쁜 대답은 당신이 할 수있는 것들

var numArray = [12, 33, 55]; 
var funcArray = []; 
var numArrLength = numArray.length; // Don't do this in for loop to avoid the check multiple times 
for(var j=0; j < numArrLength; j++) { 
    var scopeMe = function() { 
     var numToReturn = numArray[j]; 
     console.log('now loading... ' + numToReturn); 
     var newFunc = function() { 
      return numToReturn; 
     }; 
     return newFunc; 
    }(); 
    funcArray.push(scopeMe); 
}; 
console.log('now me'); 
console.log(funcArray); 

console.log(funcArray[0]()); 
console.log(funcArray[1]()); 
console.log(funcArray[2]()); 
console.log(funcArray[1]()); // To ensure it's repeatable 

편집

var funcArray = []; 
for(...) { 

    var newFunc = function() { 
    return numArray.pop(); 

    } 
    funcArray.push(newFunc); 
} 
여기서 핵심은 자바 스크립트 함수가 변수를 지명 될 수 있다는 것입니다

같은이며, 그와 같이 주변을 돌아 다녔다 :

+0

아마도 이것은 작동하지 않을 것입니다.'i'는'newFunc' 클로저 밖에있을 것이고 매번 마지막 항목을 반환 할 것입니다. – Stoive

+0

아마도 더 일반적인 numArray.pop(); 더 낫겠 니? 주문에 문제가있는 것이 아닌지 확실하지 않은 경우 :) –

+0

나는 downnotes에 대한 자격이 있는지 잘 모르겠다. downvotes에 대한 피드백을받을 수 있습니까? –

1

여기에 세 가지 중요한 단계에있다 :

  • 배열에서 숫자 값을 추출하십시오. i의 반복자와 루프 내에서, 그것은 다음과 같습니다 i 그 값을 유지하지 않기 때문에

    var num = numArray[i];

  • 이 새 기능을 만들 때이 있다고, 중요하다 - 그것은 겁니다 for 루프가 완료되면 마지막 값으로 다시 설정됩니다.자체가 다음과 같을 수 기능은 :

    function() { return num; }

  • 중요하다 더 이상 i에 대한 참조, 없다 - 더 잘 이해하기 위해 약 closures를 참조하십시오. 마지막 단계는 원하는 함수 배열에 새 함수를 추가하는 것입니다.

... 완료되었습니다.

+2

이 숙제는 의도적으로 반복자 및 종료에 관한 일반적인 실수를 대상으로하는 것으로 보입니다. 교사/강사/가정 교사/무엇이든간에 최고야! – Stoive

관련 문제