将文件列表数组转换为合并的文件夹结构数组

时间:2017-09-05 13:18:26

标签: javascript arrays json multidimensional-array

我有一个我的砖块音乐磁盘的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}
     ]
    }
]

我一直在试验,但仍未找到准确的解决方案。有什么想法吗?

1 个答案:

答案 0 :(得分: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();
};

我知道这不是我问题的确切答案。它解决了我的问题,但是以一种与我认为必须解决的方式不同的方式(转换数组)。