2014-03-27 2 views
3

JavaScript에서 배열 및 복제 인수를 입력 매개 변수로 사용하여 복제 된 배열을 반환하는 배열 복제 함수를 작성하려고합니다. 이러한처럼자체 실행 내부 함수를 사용하는 JavaScript의 배열 복제 기능

:

expect(replicate([2,3,4],2).toEqual([2,3,4,2,3,4])); 

그리고이 완료되면 외부 함수에 원하는 값을 반환해야 반복적으로 불리는자가 실행 내부 기능으로 이러한 목표를 달성하기 위해 노력하고있어.

내부 기능이 제대로 작동하는 것 같다 :

var replicate = function (inputArray, n) { 
    var outputArray = []; 
    return (function replicateInner(n) { 
     if (n > 0) { 
      outputArray.push(inputArray.slice(0)); 
      replicateInner(--n) 
     } else { 
      alert('inner function returns: ' + outputArray); 
      //inner function returns: [2,3,4,2,3,4] 
      return outputArray; 
     } 
    })(n); 

}; 

을하지만 외부 함수를 호출 할 때, 내가 여기에 누락 될 수 있습니다 어떤

alert(replicate([2,3,4],2)); // returns undefined, not [2,3,4,2,3,4] 

어떤 생각 undefined를 반환? 감사합니다. 당신이 밀어 당신은 또한이

return replicateInner(--n); 

처럼 replicateInner(--n)에서 결과를 반환하지 않기 때문에

답변

4

inputArray.slice(0)outputArray에, 결과는 당신이 필요 무엇이

[ [ 2, 3, 4 ], [ 2, 3, 4 ] ] 

처럼 될 것입니다 이 배열을 연결하는 것입니다.

outputArray = outputArray.concat(inputArray.slice(0)); 

이 변경되면 출력은

[ 2, 3, 4, 2, 3, 4 ] 
+0

그랬습니다! 감사! 여기에 일하는 바이올린이 있습니다 : http://jsfiddle.net/databass/hX8Qk/ –

+0

@DavidByman 도움이 된 것을 기쁘게 생각합니다! 유용하다고 생각되면 [내 대답 수락] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)을 자유롭게 느껴보십시오. :-) – thefourtheye

+0

하지만 push 나 concat를 사용하든 동일한 결과를 얻습니다. –

1

굉장한 질문이됩니다. 다음은 IIFE와 재귀가 모두 포함 된 간단한 대답입니다. IIFE가 모두 폐쇄 범위에 있기 때문에 아무 것도 전달하지 않거나 아무 것도 전달하지 않아도됩니다.

var replicate = function (inputArray, n) { 
    var outputArray = []; 
    (function replicateInner() { 
     if (n > 0) { 
      outputArray = outputArray.concat(inputArray.slice(0)); 
      --n; 
      replicateInner() 
     } 
    })(); 
    return outputArray; 
}; 
+0

경고가 훨씬 더 명확하면 더욱 명확 해집니다. 감사! –