2012-06-15 4 views
0

이 코드를 사용하여 개체 배열을 정렬합니다. 객체의 데이터는 채널과 시간 (시, 분)입니다. 시간순으로 채널을 기준으로 정렬하고 싶습니다. data 객체 배열이 같은이며, 이미 정렬개체 배열을 시간순으로 정렬합니다. 가장 늦은 순서에서 오름차순으로 정렬합니다.

channel_array[icount].data[0].hour 
channel_array[icount].data[0].minutes 

그건 :

[{hour:1, minutes:10},{hour:4, minutes:01}...] 

지금 필요한 건 초기의 채널을 분류하는 것입니다

채널 데이터는이 방법으로 액세스 할 수 있습니다 데이터 배열 {hour:1, minutes: 10}의 첫 번째 요소에 대한 최신 정보. 3 중첩 된 루프를 사용하여이 작업을 수행합니다. 그러나 이것은 이상적이지 않습니다. 분류 작업을 수행하는 더 좋은 방법이 있습니까?

 var current_time = new Date(); 
     var current_hour = current_time.getHours(); 
     var comp_hour = current_hour - 1; 
     for (var ih = 0; ih < 24; ih++) { 
      comp_hour += 1; 
      if (comp_hour == 24) { comp_hour = 0; } 
      for (var minutes = 0; minutes < 60; minutes++) { 
       for (var icount = 0; icount < channel_array.length; icount++) { 
        if (channel_array[icount].data.length > 0) { 
         var channel_hour = channel_array[icount].data[0].hour; 
         var channel_minutes = channel_array[icount].data[0].minutes; 
         var channel_phase = channel_array[icount].data[0].phase; 
         var next_day = channel_array[icount].data[0].next_day; 
         if (channel_phase.toLowerCase() == "pm" && channel_hour != 12) { channel_hour += 12; } 
         if (parseInt(channel_hour) == parseInt(comp_hour) && parseInt(channel_minutes) == parseInt(minutes) && next_day != 1) { 
          channel_array_sort.push(channel_array[icount]); 
         } 
        }   
       } 
      } 
     } 
+0

는'channel_array', 또는'channel_array.data'을 정렬 할 배열인가? 이전 버전 인 경우 정렬되지 않은 입력 및 정렬 된 출력의 모양에 대한 정보를 더 제공 할 수 있습니까? –

+0

'.data' 객체에 대한 정렬 결과를 기반으로 channel_array [icount]를 정렬하려고합니다. 그 객체는 이미 정렬되어 있습니다. 시간별로 채널을 정렬하고 싶습니다. – user823527

답변

5

좋은 영주님, 이것은 지나치게 복잡합니다! 그냥 passing a custom comparator to Array.sort 어때요?
솔직히 당신이 정렬하려고하는 배열을 정확하게 알아내는 힘든 시간을 보내고 있습니다 만, 일반적으로는 다음과 같이 보일 것입니다 :

var input = [{hour:1, minutes:10},{hour:4, minutes: 1}, ...]; 
input.sort(function (a, b) 
{ 
    // compare hours first 
    if (a.hour < b.hour) return -1; 
    if (a.hour > b.hour) return 1; 

    // else a.hour === b.hour, so compare minutes to break the tie 
    if (a.minute < b.minute) return -1; 
    if (a.minute > b.minute) return 1; 

    // couldn't break the tie 
    return 0; 
}); 

N.B.이 작업은 원래 배열이 수정되었음을 의미하는 적절한 위치 정렬을 수행합니다. 수용 할 수없는 경우, 정렬하기 전에 make a copy of the array을 사용하십시오.

var input = /* same as before */; 
var output = input.concat(); 
output.sort(function() 
{ 
    // same as before 
}); 

영업에서 해결하는 시작점 :

channel_array_sort = channel_array.concat(); 

channel_array_sort.sort(function (a, b) 
{ 
    if (a.data == undefined || b.data == undefined) return 0; 
    if (a.data.length <= 0 || b.data.length <= 0) return 0; 

    // compare hours first 
    var a_hour = a.data[0].hour; 
    if (a.data[0].phase == "pm") a_hour += 12; 
    var b_hour = b.data[0].hour; 
    if (b.data[0].phase == "pm") b_hour += 12; 

    if (a_hour < b_hour) return -1; 
    if (a_hour > b_hour) return 1; 

    // else a.hour === b.hour, so compare minutes to break the tie 
    if (a.data[0].minutes < b.data[0].minutes) return -1; 
    if (a.data[0].minutes > b.data[0].minutes) return 1; 

    // couldn't break the tie 
    return 0; 
}); 

var print_sort = JSON.stringify(channel_array_sort);      
alert('print_sort b '+print_sort); 
+3

+1. 외모와 소리보다 쉽습니다. 전구 모멘트가 될 것입니다. – Ben

+0

이 솔루션을 가리켜 주셔서 감사합니다. 나는 여전히 정렬 기능을 디버깅 중입니다. 위의 편집을 참조하십시오. 그러나 이것은 올바른 방향으로 보인다. – user823527

+0

@ user823527 실제로 나에게 도움이 더 필요하다면, 이전에 언급했듯이 실제로 입력과 예상 출력 예제를 제공 할 수 있다면 매우 유용 할 것입니다. –

관련 문제