2017-09-05 39 views
0

我有一個我的磚砌音樂磁盤的xml備份,我試圖很好地訪問,以探索那裏的文件夾(專輯)和曲目。到目前爲止,我創建了一個包含所有文件位置的數組,因爲這就是xml的構建方式。每個文件夾都以逗號分隔。現在我想將它全部合併並轉換爲具有文件夾結構的數組。從那裏開始,我可以使用該數組構建類似瀏覽器的界面來瀏覽我的舊音樂曲目。將文件列表數組轉換爲合併的文件夾結構數組

以下數組是什麼,我現在已經和要轉換的例子:

[ 
    [x, xy, xya, {file: one}], 
    [x, xy, xya, {file: two}], 

    [x, xy, xyz, {file: one}], 

    [x, xy, {file: one}], 

    [x, xz, {file: one}], 
    [x, xz, {file: two}], 

    [x, {file: one}], 
    [x, {file: two}], 

    [y, {file: one}] 
] 

我想上面的數組轉換成類似如下:

[ 
    {folder: x, 
    content: 
    [ 
     {folder: xy, 
      content: 
      [ 
       {folder: xya, 
       content: 
       [ 
        {file: one}, 
        {file: two} 
       ] 
       }, 
       {folder: xyz, 
       content: 
       [ 
        {file: one} 
       ] 
       }, 
       {file: one} 
      ] 
     }, 
     {folder: xz, 
      content: 
      [ 
       {file: one}, 
       {file: two} 
      ] 
     }, 
     {file: one}, 
     {file: two} 
    ] 
    }, 
    {folder: y, 
    content: 
    [ 
     {file: one} 
    ] 
    } 
] 

我一直在嘗試,但仍還沒有找到準確的解決方案。有任何想法嗎?

+0

在第一個代碼中你有多維數組,在上面的代碼中你有數組中的對象。 – itzikb

+0

您可以嘗試使用遞歸函數。檢查元素類型is_array,is_object array_key_exists以識別文件夾或文件等 – manuerumx

+0

感謝您的提示,我會繼續嘗試。可能在文件夾中添加'type:folder'並將'type:file'添加到文件可能更容易處理,而不是使用遞歸函數。但還沒有找到解決辦法。 –

回答

0

我設法實現了我的目標。我是用下面的代碼完成的,它是完整的代碼。我甚至設法跳過第一個數組形式並立即生成第二個形式(請參閱我的問題,我的意思是數組)。我的解決方案:

window.onload = function() { 
    var data = [], dataLength, datanest, datanestLength; 

    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     if (this.readyState == 4 && this.status == 200) { 
      var doc = this.responseXML, 
       tr = doc.getElementsByTagName('tr'), trLength = tr.length; 

      var filedir, level, levelLength; 
      for (var i = 1; i < trLength; i++) { 
       filedir = tr[i].getElementsByTagName('td')[7].innerHTML; 
       // filedir is formed like "foldername\foldername\filename.ext" etc. 
       level = filedir.split('\\'); 
       levelLength = level.length; 
       for (var j = 0; j < levelLength; j++) { 

        if (j == 0 && j < levelLength - 1) { 
         dataLength = data.length; 
         if (dataLength == 0 || 
          data[dataLength - 1].type == 'file' || 
          data[dataLength - 1].Name !== level[j]) { 
          data.push({ 
           type: 'folder', 
           Name: level[j], 
           content: [] 
          }); 
         } 
         datanest = data[data.length - 1].content; 

        } else if (j < levelLength - 1) { 
         datanestLength = datanest.length; 
         if (datanestLength == 0 || 
          datanest[datanestLength - 1].type == 'file' || 
          datanest[datanestLength - 1].Name !== level[j]) { 
          datanest.push({ 
           type: 'folder', 
           Name: level[j], 
           content: [] 
          }); 
         } 
         datanest = datanest[datanest.length - 1].content; 

        } else { 
         if (j == 0) { datanest == data; } 
         datanest.push({ 
          type: 'file', 
          Track: tr[i].getElementsByTagName('td')[3].innerHTML, 
          Title: tr[i].getElementsByTagName('td')[0].innerHTML, 
          Artist: tr[i].getElementsByTagName('td')[1].innerHTML, 
          Time: tr[i].getElementsByTagName('td')[2].innerHTML, 
          Release: tr[i].getElementsByTagName('td')[4].innerHTML, 
          'Release Date': tr[i].getElementsByTagName('td')[8].innerHTML, 
          Label: tr[i].getElementsByTagName('td')[5].innerHTML, 
          Genre: tr[i].getElementsByTagName('td')[6].innerHTML, 
          File: level[j] 
         }); 
        } 
       } 
      } 
      console.log(data);//SUCCESS 
     } 
    }; 
    xhttp.open('GET', 'backup.xml', true); 
    xhttp.send(); 
}; 

我知道這不是我的問題的確切答案。它解決了我的問題,但以一種不同於我認爲必須解決的方式(轉換數組)。