2014-05-23 10 views
0

배열 정렬없이 정렬과 동일한 기능 (예 : 비교 함수 전달)을 갖고 싶지만 각 개체에 대해 인수로 사용하는 함수를 호출하십시오. 그 특정 원소의 순서.정렬하지 않고 배열의 요소 순서 지정

그런 다음 그것을 이런 식으로 사용할 수 있습니다 내가 루프를 작성해야하고에 알고리즘을 정렬합니다 경우

var users=[ 
    {name:"Stephen",age:12}, 
    {name:"Mike",age:17}, 
    {name:"Jeffrey",age:32}, 
    {name:"Anna",age:15} 
] 

var result=users.getOrder(
    function(userA,userB) 
      {return userA.age-userB.age>0;}, 
    function(user,order) 
      {user.num=order;}); 

/* result=[ 
    {name:"Stephen",age:12,num:4}, 
    {name:"Mike",age:17,num:2}, 
    {name:"Jeffrey",age:32,num:1}, 
    {name:"Anna",age:15,num:3} 
]*/ 

나는 그들이 보통의 배열 함수를 사용하여이를 작성하는 방법 있다면 행복 할 또는 것입니다 내 개인적인. 방법이 있습니까?

답변

0

하나의 해결책은 예 : 원래 배열을 복제하고 표준 정렬을 사용하여 정렬 할 수 있습니다. 그런 다음 복제본을 반복하여 정렬 된 색인이 이름 또는 나이가 일치하는 위치인지 확인할 수 있습니다.

for(var j =0; j<b.length;j++){ 
    for(var k=0;k<a.length;k++){ 
     if(b[j].name === a[k].name){ 
      b[j].num = k; 
     } 
    } 
} 

는 거품 정렬로 바이올린을 참조하십시오 http://jsfiddle.net/GeJ6v/

+0

좋아, 그와 함께 유일한 문제는 복제가 내가 생각 소모도 약간의 시간입니다 ... 위대한하지 않은, 매핑은 O입니다 (N^2)입니다. 그런데 왜 당신은 바이올린에서 표준 정렬을 사용하지 않았습니까? – edi9999

+0

사실, 더 큰 데이터 세트에서는 조금 무거워 질 수 있습니다. 전나무 정렬 (Sir sorting) 정확한 순간에 코드가 나 앞에서 일어 났으므로 수정 했으므로 그 뒤에 더 깊은 추론은 없습니다. – Xantier

0

여기 O (N N의 *의 SQRT()) 내 솔루션입니다 :

Array.prototype.getOrder=function(compareFunction,indexFunction,setFunction) 
{ 

    var index={}; 
    this.forEach(function(user) 
       { 
        index[indexFunction(user)]=user; 
       }); 

    newUsers= this.slice().sort(compareFunction); 

    newUsers.forEach(function(user,num) 
    { 
     setFunction(index[indexFunction(user)],num); 
    }); 
    return this; 
}  

그러나, 내가 indexFunction를 추가했다, 내가 없이는 할 수 있는지 잘 모르겠다.

http://jsfiddle.net/gFLys/

관련 문제