2016-07-21 2 views
0

아래 셔플 프로그램을 작성하고 "Will It Shuffle?"을 통해 실행했습니다. 결과는 콘솔에서 작동하는 것으로 나타납니다. 그것은 배열을 뒤섞고 있습니다. 그러나 웹 사이트는 모든 빨간 상자를 보여 주므로 내 코드가 잘못되었다고 생각하게 만듭니다. 그러나 나는 그것을 보지 못합니다.셔플 프로그램에 어떤 문제가 있습니까?

function shuffle (array) { 
    var arr = [], 
     length = array.length, 
     el; 

    while (length > 0) { 
     var randomEl = Math.floor(Math.random() * (length - 0) - 0); 
     if (length > 1) { 
     el = array.splice(randomEl,1); 
     } else { 
     el = array.splice(0,1); 
     } 
     arr.push(el[0]); 
     length -= 1; 
    } 

    return arr; 
} 
+1

콘솔에서 테스트 했습니까? 너는 그걸 다 뛰었 니? 당신은 돌아오고, 그들은하지 않습니다. 그들은 배열을 변경하면, 당신은하지 않습니다 – epascarello

+0

1에서 10까지의 배열에 대한 테스트에서 랜덤 한 것으로 보입니다. 문제는 Will It Shuffle 사이트에 있다고 생각합니다. – HyperNeutrino

+0

@epascarello, 네, 여러 번. 누군가가 내 마지막 정렬 코드가 좋지 않아서 그 웹 사이트를 보냈다고했습니다. 나는이 웹 사이트에서이 웹 사이트를 테스트했으며, 셀이 완전히 빨간색으로 표시되어 있어도 콘솔에 배열이 잘 표시되어 있음을 알았음에도 불구하고. 죄송합니다. JS를 처음 사용하셨습니다. – BeerBeard

답변

1

해당 페이지는 in-place 정렬을 예상하므로 함수의 반환 값을 무시합니다. 당신은 당신의 코드 끝에이를 추가하는 경우

, 그것은 예상대로 작동합니다

array.push(...arr); 

당신은 직접 자리에서 그것을 할 수 있습니다 :

function shuffle (array) { 
    var length = array.length; 
    while (length) { 
    var randomEl = Math.floor(Math.random() * length); 
    var el = array.splice(randomEl, 1); 
    array.push(el[0]); 
    --length; 
    } 
} 
+0

고마워요, @Oriol. 나는 아직도 JS를 배우고있다. 그래서 나는 "... arr"을 밀기에 익숙하지 않다. 왜 타원과도 함께 작동하는지 설명해 주시겠습니까? – BeerBeard

+1

@BeerBeard [확산 연산자] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator)입니다. 예를 들어'arr = [1,2,3]'이라면'array.push (... arr)'은'array.push (1,2,3)'와 같이 동작합니다. 즉,'arr'의 모든 원소를'array'에 푸시합니다. – Oriol

+0

다른 답변이 유용하다는 것을 알았지 만 답변을 많이 주셔서 감사합니다. 스프레드 연산자, 내부 정렬 및 내부 코드 수행의 다른 변형에 관해 특히 감사드립니다. 좋은 학습과 감사. – BeerBeard

1

그들은 배열을 변경하면 배열을 변경하지 마십시오.

새 배열을 반환하지 말고 원래 배열을 변경해야합니다.

function shuffle (array) { 
    var arr = [], 
     length = array.length, 
     el; 

    while (length > 0) { 
     var randomEl = Math.floor(Math.random() * (length - 0) - 0); 
     if (length > 1) { 
     el = array.splice(randomEl,1); 
     } else { 
     el = array.splice(0,1); 
     } 
     arr.push(el[0]); 
     length -= 1; 
    } 

    //replace array with the new items 
    //it is like using concat, but does not produce a new array, 
    //just appends it to the original which has zero items in it. 
    Array.prototype.push.apply(array, arr); 



} 
+0

나는 네가 무슨 뜻인지 안다. 그러나이 대답은 분명하지 않다. [나에게서 downwote BTW 없음]] 정교하십시오. – HyperNeutrino

1

원본 요소를 바꿔서 새로운 배열을 만드는 것입니다.

그러나 돌아가서 전달한 배열을 보면 섞이지 않고 오히려 비어있는 것을 알 수 있습니다. 분명히, 이것은 "닥칠 것인가?"가 아닙니다. 당신에게 묻습니다.

splice() 및 push() 둘 다 항상 해당 메소드를 호출하는 배열을 변경합니다.

.push (... arr)에 대한 질문에 대답하려면 javascript의 elipses는 최신 버전 인 EcmaScript 2015와 함께 제공되는 기능입니다. "확산 연산자"입니다.

"스프레드"배열을 사용하여 함수를 호출하면 배열의 내용이 포함 된 함수를 별도의 인수로 호출하는 것과 같습니다. 예를 들어,

array.push(...[1,2,3]) 

배열에 쉼표로 구분 인자의 임의의 수를 추가 할 수

array.push(1,2,3) 

푸시()를 호출하는 것과 동일하다. 따라서 루프 된 스플 라이스로 배열 인수를 비운 다음 스프레드 연산자를 사용하여 새로 만든 arr의 내용을 빈 배열로 푸시 할 수 있습니다.