개요
JavaScript 배열에서 특정 개수만큼의 항목을 무작위로 골라 다른 값으로 바꾸고 싶다면 Math.random()과 map() 메서드를 함께 사용하면 됩니다. 먼저 중복되지 않는 무작위 인덱스를 추출한 뒤, 해당 인덱스에 위치한 값만 새로운 값으로 교체하는 방식입니다.
예제 코드
아래 코드를 살펴보겠습니다.
function substituteRandomValue(names, size) {
return function () {
const index = new Set();
do {
index.add(Math.floor(Math.random() * names.length));
} while (index.size < size)
return names.map((value, counter) => index.has(counter) ? 'Adam' : value);
};
}
var names = ['John', 'David', 'Bob', 'Mike', 'Carol', 'Sam'],
result = substituteRandomValue(names, 2);
console.log(...result());코드 동작 원리
substituteRandomValue(names, size) 함수는 두 가지 인자를 받습니다. 첫 번째는 원본 배열이고, 두 번째는 대체할 항목의 개수입니다.
내부에서는 Set 객체를 사용해 중복 없는 무작위 인덱스를 생성합니다. do...while문 루프가 반복되면서 Math.random()으로 배열 길이 범위 내의 난수를 만들고, Math.floor()로 정수화하여 Set에 추가합니다. Set은 중복을 허용하지 않기 때문에, 원하는 개수(size)만큼 고유한 인덱스가 모일 때까지 반복됩니다.
이후 map() 메서드가 배열 전체를 순회하면서, 현재 순번(counter)이 Set에 포함되어 있으면 해당 값을 'Adam'으로 대체하고, 그렇지 않으면 기존 값을 그대로 유지합니다.
실행 방법
위 프로그램을 실행하려면 다음 명령어를 사용합니다.
node fileName.js.
여기서는 파일 이름이 demo278.js라고 가정합니다.
실행 결과
콘솔에는 아래와 같은 출력이 나타납니다. 실행할 때마다 무작위로 선택된 위치가 달라지므로 결과는 매번 변경됩니다.
PS C:\Users\Amit\javascript-code> node demo278.js John David Bob Adam Carol Adam
위 예시에서는 6개 요소 중 2개가 무작위로 선택되어 'Adam'으로 대체된 것을 확인할 수 있습니다.