2010-01-05 2 views
1

필자는 쉼표로 분리 된 문자열을 가지고 있습니다. 그 중 재발이없는 것을 확인하면서 원래 문자열에있는 항목의 임의의 순서를 포함하는 새 문자열을 만들어야합니다. 예 : 1,2,3,1,3을 실행하면 2,3,1이되고 다른 시간이 3,1,2가됩니다.JS에서 재발없이 주어진 목록에서 임의의 목록을 효율적으로 만드는 방법은 무엇입니까?

원래 문자열에서 임의의 항목을 선택하고 새 문자열을 반복하여 코드가 이미 존재하지 않는지 확인합니다. 존재하지 않으면 항목이 삽입됩니다. 그러나 C#에서는 새 배열에서 매번 반복되는 대신 해시 테이블을 사용했을 것이라고 생각합니다. 예를 들어 난수가 동일한 결과를 줄 경우를 방지하기 위해 원래 배열에서 삽입 한 항목을 제거하는 것이 하나의 개선 사항이 될 수 있습니다.

아래 코드를 개선 할 것을 제안 할 수 있으면 기쁘게 생각합니다.

originalArray = originalList.split(',');    
for (var j = 0; j < originalArray.length; j++) { 
    var iPlaceInOriginalArray = Math.round(Math.random() * (originalArray.length - 1)); 
    var bAlreadyExists = false;    
    for (var i = 0; i < newArray.length; i++) { 
     if (newArray[i].toString() == originalArray[iPlaceInOriginalArray].toString()) { 
      bAlreadyExists = true; 
      break; 
     } 
    } 

if (!bAlreadyExists) 
    newArray.push(originalArray[iPlaceInOriginalArray]); 
} 

고마워요!

답변

1

는 여전히 중복을 제거하기 위해 자바 스크립트의 '해시'를 사용할 수 있습니다. JS에서만 객체라고 부릅니다.

function removeDuplicates(arr) { 
    var hash = {}; 
    for (var i=0,l=arr.length;i<l;i++) { 
     hash[arr[i]] = 1; 
    } 
    // now extract hash keys... ahem... 
    // I mean object members: 
    arr = []; 
    for (var n in hash) { 
     arr.push(n); 
    } 
    return arr; 
} 

아, 배열에서 임의로 선택합니다. 원래 배열을 파괴 할 수있는 상태인지 (귀하의 경우에 인) 다음 스플 라이스를 사용

function randInt (n) {return Math.floor(Math.random()*n)} 

function shuffle (arr) { 
    var out = []; 
    while (arr.length) { 
     out.push(
      arr.splice(
       randInt(arr.length),1)); 
    } 
    return out; 
} 

// So: 
newArray = shuffle(
       removeDuplicates(
        string.split(','))); 
0

해결책을 사용하면 같은 번호를 여러 번 선택하지 않을 수 있으므로 다른 사람이 선택되지 않을 수 있습니다. 요소 수가 많지 않은 경우 (최대 100 개) 소스 배열에서 항목을 삭제하면 최상의 결과를 얻을 수 있습니다.
편집

originalArray = originalList.split(',');    
for (var j = 0; j < originalArray.length; j++) { 
    var iPlaceInOriginalArray = Math.round(Math.random() * (originalArray.length - 1 - j)); 
var bAlreadyExists = false;    
for (var i = 0; i < newArray.length; i++) { 
    if (newArray[i].toString() == originalArray[iPlaceInOriginalArray].toString()) { 
     bAlreadyExists = true; 
     break; 
    } 
} 

var tmp = originalArray[originalArray.length - 1 - j]; 
originalArray[originalArray.Length - 1 - j] = originalArray[iPlaceInOriginalArray]; 
originalArray[iPlaceInOriginalArray] = tmp; 

if (!bAlreadyExists) 
    newArray.push(originalArray[iPlaceInOriginalArray]); 
} 
+0

고마워, 난 그 통지를하지 않았다. – Nir

1

// 첫 번째 배열을 정렬 경우, 중복을 건너 뛸 빨리, 당신은 각각의 고유 한 항목을 스플 라이스 수 있습니다 새 배열을 만들 때 임의의 위치로 이동합니다.

var s = '함수, 문자열, 개체, 문자열, 배열, 날짜, 오류, 문자열, 문자열'+ '수학, 숫자, RegExp, 그룹, 컬렉션, Timelog, 색상, 문자열';

var A1= s.split(',').sort(), A2= [], tem; 
while(A1.length){ 
tem= A1.shift(); 
while(A1[0]== tem) tem= A1.shift(); 
if(tem) A2.splice(Math.floor(Math.random()*A2.length), 0, tem); 
} 

경고 (A2.join (''))

+0

감사합니다, @kennebec! – Nir

관련 문제