2011-02-27 13 views
0
에서 고정 폭 배열을 채우는

나는이 형식의 입력 배열을 가지고 :만들기 및 자바 스크립트

[[timestamp, jobid, time to completion],[..]] 
데이터가 SQL 모두 타임 스탬프로 그룹화 DB, 및 작업 ID, 그래서에서입니다

배열과 같이 보인다 :

[ 
[1, 30, 400], 
[1, 31, 200], 
[2, 29, 300], 
.. 
] 
I, 즉, 모든 작업의 ​​ID로 대신 한 행의 타임 스탬프 당 하나의 행을 모든 작업 ID에 대해 하나의 열이있는 새로운 배열을 만들고 싶습니다

.

그래서 나는 제외하고, 충분히 간단한 몇 가지 위의 배열을 통해 반복 코드, 새로운 배열을 채워을 쓴 결과 배열은 결과의 모습, 즉, 폭이 고정되지 않습니다

[ 
[1, 400, 200], 
[2, 300] 
.. 
] 

[1]의 값이 작업 ID 30이라는 말을 할 수 없으므로 의미있는 헤더 행을 가질 수 없습니다. 내가하고 싶은 것은,이 형식의 데이터입니다 :

timestamp, jobid29, jobid30, jobid31 
[ 
[1, 0, 400, 200], 
[2, 300, 0, 0], 
.. 
] 

I 출력 할 수 없습니다지도, 불행하게도.

어떻게하면됩니까? 나는 모든 뚜렷한 jobids를 얻기 위해 한 번 입력을 통과해야 할 것입니다. 그리고 나는 각 jobid를 위치 등으로 매핑 할 것입니다. 이것이 최선의 방법인지 궁금합니다.

감사합니다.

답변

1

내 솔루션에서는 두 가지 배열과 두 개의 맵을 사용하여 최적화 할 수 있습니다. 다음은 대략적인 스케치입니다.

  1. 배열을 jobID로 정렬하십시오. ("jobList"라고 부름)

  2. 고유 한 타임 스탬프를 입력하는 "지도"를 유지하십시오. ("timeStampMap"). 지도에는 고유 한 타임 스탬프마다 하나의 항목이 있어야합니다.

  3. 고유 한 타임 스탬프의 다른 배열을 유지하고 정렬하십시오. ("timeList")

  4. 은 "timeStampMap"의 각 항목은

  5. 으로 반복 타임 스탬프 목록의 각 값 이상이 타임 스탬프 값에 대한 작업의 또 다른 맵을 유지합니다.

    각 반복 내에서 jobList의 각 작업을 반복합니다. 작업이 해당 타임 스탬프 맵에있는 경우 출력 job.completionTime

    그렇지 않은 경우 출력 0.

아래에 나와있는 코드에는 두 가지 최적화 방법이 있습니다. 1. 입력 배열을 복사하지 않고도 "jobList"로 사용할 수 있습니다. 2.지도의지도를 하나의 큰지도로 결합 할 수 있습니다.

function jobSorter(a,b) { 
    return a.jobID - b.jobID; 
} 

function numberSort(a,b) { 
    return a - b; 
} 


function buildSortedArray(yourArray) { 

    var index, j, item; 
    var jobList = []; // array of {jobID, timeStamp, timeComp}; 
    var timeStampMap = {}; 
    var timeStampList = []; 
    var key, jobkey; 
    var output = []; 

    // loop through every item in the array 
    for (index = 0; index < yourArray.length; index++) { 
     item = yourArray[index];   

     // push each item into a "job list" 
     job = {jobID: item[1], timeStamp: item[0], timeComp: item[2]}; 
     jobList.push(job); 

     // now use both a map and a list to keep track of all the unique timestamps 
     key = "$timestamp$" + job.timeStamp.toString(); 

     if (timeStampMap[key] === undefined) { 
      timeStampMap[key] = {}; 
      timeStampMap[key].jobMap = {}; 

      timeStampList.push(job.timeStamp); // keep another timestamp array that we can sort on 
     } 

     // add this job to the timestamp 
     jobkey = "$jobid$" + job.jobID.toString(); 
     timeStampMap[key].jobMap[jobkey] = job; 
    } 

    // let's do some sorting 
    timeStampList.sort(numberSort); // timeStampList is now in ascending order 
    jobList.Sort(jobSorter);  // jobList is now in ascending order 


    for (index = 0; index < timeStampList.length; index++) { 
     item = []; 

     item.push(timeStampList[index]); 
     for (j = 0; j < jobList.length; j++) { 

      key = "$timestamp$" + timeStampList[index].toString(); 
      jobkey = "$jobid$" + jobList[j].toString(); 

      if (timeStampMap[key].jobMap[jobkey]) { 
       item.push(timeStampMap[key].jobMap[jobkey].timeComp); 
      } 
      else { 
       item.push(0); 
      } 
     } 

     output.push(item); 
    } 


    return output; 
} 
+0

좋은 해결책. 'key = $ timestamp $ + job.timeStamp.toString()'의 목적을 설명해 주시겠습니까? 개요는 이것이'key = job.timeStamp.toString()'이어야 함을 암시합니다. 또한 jobkey와 동일합니다. – johnhunter

+1

죄송합니다. 따옴표 안에 "$ timestamp $"여야합니다. 마찬가지로 "$ jobid $"는 따옴표로 묶습니다. 결정된. 나는 두 가지 이유로 키의 고유 한 식별자를 앞에 붙이는 것을 좋아한다. 1) 디버그하기 쉽다. (firebug에서 쉽게 볼 수있다.) 2) 객체 속성 이름으로 리터럴 숫자를 사용하는 것이 옳지 않다고 느낀다. 배열과 혼동을 일으킬 수 있습니다. – selbie

+0

나는 당신의 생각을 좋아합니다. 감사. – johnhunter

관련 문제