2017-03-23 5 views
0

배열을 섞어서 새로운 배열을 반환하는 방법을 알고 싶습니다.어레이 섞기 및 JS에서 새로운 배열 반환

How to randomize (shuffle) a JavaScript array?

이 솔루션은 같은 배열이 단행 반환에 완벽하게 작동,하지만 난 정말 왜 이해가 안 : 지금까지 나는 스택 오버플로에서이 솔루션을 보았다. 아무도 이것을 설명하고 그것을 수정하여 새로운 배열을 반환하도록 도울 수 있습니까?

감사합니다!

var newArray = [].concat(originalArray); 

링크 된 대답에 솔루션의 대부분의 첫 번째 줄에 그것을 수행 할 수 당신은을 얻는 것 :

+0

에 대한 어쩌면 유용한? – ramden

+0

https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle – Bergi

답변

1

내가 아는 가장 쉬운 방법은 배열의 복사본을 만들려면 사용 변경되지 않은 원본과 새로운 배열.

function shuffle(originalArray) { 
    var array = [].concat(originalArray); 
    var currentIndex = array.length, temporaryValue, randomIndex; 

    // While there remain elements to shuffle... 
    while (0 !== currentIndex) { 

    // Pick a remaining element... 
    randomIndex = Math.floor(Math.random() * currentIndex); 
    currentIndex -= 1; 

    // And swap it with the current element. 
    temporaryValue = array[currentIndex]; 
    array[currentIndex] = array[randomIndex]; 
    array[randomIndex] = temporaryValue; 
    } 

    return array; 
} 
+1

[JavaScript로 배열 복제] (https://davidwalsh.name/javascript-clone-array)에서 ' var array = originalArray.slice (0);'. – Ouroborus

+0

@Ouroborus 예. 배열을 복제하는 또 다른 방법입니다. 나는 그가 제안한 것처럼'Array' 프로토 타입을 수정해야한다고 생각하지 않습니다. 또한,'concat'는'slice'보다 상당히 빠릅니다. https://jsperf.com/test-slice-vs-concat/1 –

+0

사실, Chrome에서는 Safari와 동등하고 Firefox와 비교하면 훨씬 빠릅니다 'slice'는 상당히 빠릅니다. 오, 브라우저 ... : P –

0

당신이 제 3 자 라이브러리를 사용하려면, Lodash이 매우 좋다 : 여기에 링크 된 질문에 최고 등급의 답변의 수정 된 버전입니다.

_.shuffle()을 사용하면 새 배열을 얻을 수 있습니다.

+0

이 답변은 아무 것도 설명하지 않습니다. – Bergi

0

당신은 그것을 원래 배열을 수정하지만, 단지 새 (사본)을 반환하지 싶은 당신

<p id="output"> 

<script> 
var arrayList= ['a','b','c','d','e','f','g']; 
arrayList.sort(function(){ 
    return 0.5 - Math.random() 
}) 

document.getElementById("output").innerHTML = arrayList; 

</script>