2011-02-27 66 views
0
一個固定的寬度

我有這種格式的輸入數組:創建並填充的陣列與在JavaScript

[[timestamp, jobid, time to completion],[..]] 

的數據是從SQL DB,由兩個時間戳分組,和作業ID,所以陣列的樣子:

[ 
[1, 30, 400], 
[1, 31, 200], 
[2, 29, 300], 
.. 
] 

我想創建一個具有每個作業ID一列新的陣列,而不是一行與每一個作業ID,即每時間戳一行。

所以,我寫一些代碼,通過上述陣列迭代,並填充一個新的數組,簡單,除,結果陣列是不固定的寬度,即,其結果是這樣的:

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

這使我無法說[1]中的值是作業ID 30,所以我不能擁有有意義的標題行。 我想,在這種格式的數據:

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

我不能輸出的地圖,很遺憾。

我該如何做到這一點?我知道我必須通過輸入一次才能獲得所有不同的工作,然後我想我會將每個工作映射到一個位置等等,我想知道這是否是最好的方法?

謝謝。

回答

1

我的解決方案使用兩個數組和兩個具有豐富優化可能性的地圖。這裏有一個粗略的草圖:

  1. 按jobID排序你的數組。 (我們稱之爲「jobList」)

  2. 保留一個以唯一時間戳爲關鍵的「地圖」。 ( 「timeStampMap」)。地圖應該包含每個唯一時間戳的一個條目。

  3. 保留另一個唯一時間戳陣列並對其進行排序。 (「timeList」)

  4. 在「timeStampMap」每個項目保留在該時間戳值

  5. 迭代中的時間戳列表中的每個值的工作崗位另一個地圖。

    在每次迭代中,迭代jobList中的每個作業。 如果作業在相應的時間戳映射輸出job.completionTime

    否則,輸出零。

對於我在下面顯示的代碼有兩種可能的優化。 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 2011-02-27 08:11:44

+1

糟糕,它應該是引號中的「$ timestamp $」。同樣,引號中的「$ jobid $」。固定。我喜歡爲密鑰添加唯一標識符,原因有兩個: 1)易於調試(易於在螢火蟲中查看這些屬性) 2)將字面數字用作對象屬性名稱不太合適。與數組混淆。 – selbie 2011-02-27 08:24:19

+0

我喜歡你的想法。謝謝。 – johnhunter 2011-02-27 09:44:54