_.shuffle = function (arr) {
let arrCloned = arr.slice();
// 원본 배열을 건드리지 않는 slice 메소드를 활용하여 새로운 배열을 arrCloned에 할당해준다.
for (let fromIdx = 0; fromIdx < arr.length; fromIdx++) {
// for반복문을 사용하여 배열을 순회한다.
const toIdx = Math.floor(Math.random() * arr.length);
// 상수로 선언 된 toIdx에 랜덤된 새로운 배열을 할당한다.
let temp = arrCloned[fromIdx];
// 변수 temp에 arrCloned의 각 인덱스들의 값을 할당해준다.
arrCloned[fromIdx] = arrCloned[toIdx];
// 배열을 순회할 때 접근한 각 인덱스들의 값을 랜덤으로 새로 생성된 정수를 인덱스로 하는 값 toIdx에 할당해준다.
arrCloned[toIdx] = temp;
}
// 새로 생성된 값을 temp로 할당한다.
return arrCloned;
};
// 랜덤으로 새롭게 재배치된 배열을 리턴해준다.
_.shuffle은 배열 요소의 순서가 랜덤하게 변경된 새로운 배열을 리턴합니다.
slice는 원본 배열을 건드리지 않고 begin부터 end(end 미포함)까지의 새로운 배열을 가져온다.
Math.floor() 함수는 주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환합니다.(내림), 정수를 반환하는 메소드 (소숫점 X)
Math.random() 은 0~1 사이의 실수를 반환한다.
랜덤하게 수를 정해주는 클래스, Math.random = 랜덤의 난수를 반환하는 메소드
위 코드를 다시 한번 풀어보자면,
1) slice메소드를 활용하여 원본 배열을 건드리지 않는(얕은 복사) 새로운 배열을 변수 arrCloned에 할당한다.
2) for 반복문을 통해 배열을 순회하면서 toIdx 랜덤의 숫자값을 선정해준다.
3) arrCloned[fromIdx] = arrCloned[toIdx]를 통해 순서가 바뀐 즉 랜덤한 숫자들을 가진 배열을 생성하게 된다.
4) 그렇게 랜덤으로 새롭게 배치된 배열을 리턴해준다.