2017-09-05 10 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

私は目標を達成することができました。私は完全なコードである以下のコードでそれを行いました。私は最初の配列フォームをスキップして、即座に2番目のフォームを生成することさえできました(私が意味する配列についての私の質問を参照してください)。私の解決策:

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(); 
}; 

私はそれが私の質問に対する正確な答えではないことを知っています。それは私が持っていた問題を解決しましたが、私はそれを解決しなければならないと思ったより少し違った形で(配列を変換して)解決しなければなりませんでした。

関連する問題