2016-11-11 3 views
1

Получаю данные с сервера в формате flat tree. Затем я переношу данные JsTree библиотека, которая строит дерево для меня. Перед передачей данных JsTree Я фильтрую данные и удаляю пустые элементы типа folder, у которых нет детей.Удалить все элементы без детей из массива

Вот некоторые код, который я получил:

dataFilter: function (jsonString) { 
    function getItemList(item, list) { 
    if (item === null) { 
     return null; 
    } 
    if (item.parent === "#" && item.type !== "folder") { 
     return item; 
    } else { 
     if (item.type === "folder") { 
     var itemFolder = _.findWhere(list, { parent: item.id }); 
     if (itemFolder) { 
      return item; 
     } 
     } else { 
     return item; 
     } 
    } 
    return null; 
    }; 
    function removeEmptyFolder(list) { 
    console.log(list); 
    var treeListTemp = []; 
    for (var i = 0; i < list.length; i++) { 
     treeListTemp.push(getItemList(list[i], list)); 
    } 
    var treeList = []; 
    for (var j = 0; j < treeListTemp.length; j++) { 
     var k = getItemList(treeListTemp[j], treeListTemp); 
     if (k === null) { 
     removeEmptyFolder(_.filter(treeListTemp, 
            function(item) { 
      return item !== null; 
     })); 
     } else { 
     treeList.push(k); 
     } 
    } 
    //console.log(treeList); 
    return treeList; 
    }; 
    return JSON.stringify(_.filter(removeEmptyFolder(JSON.parse(jsonString)), 
           function (item) { 
    return item !== null; 
    })); 
} 

Вот рабочий пример https://jsfiddle.net/nkqgot2a/11/

Этот код работает почти сразу. Но если последний элемент содержит дочерний элемент, он не удаляется из списка. Элемент «папка 9» не должен появляться в списке после фильтрации данных.

Скажите, пожалуйста, как исправить мою функцию, чтобы удалить все пустые папки?

Как мне кажется, рекурсия вызвана чрезмерным количеством времени.

+0

' "папка 9"' ___does___ имеют детей. родительская папка "12" '' '' 38 "', которая является '' папкой 9 "'. Он не пуст, поэтому он не удаляется. – Cerbrus

+0

@Cerbrus После первого вызова функции 'removeEmptyFolder' удаляет элемент' 'folder 11" '. После второго вызова функции через рекурсию происходит '' folder 12 "' удаление элемента. Когда функция вызывается в третий раз, папка '' 9 "' элемента не содержит дочерних элементов. –

+1

Потому что 'folder 9' является папкой и имеет родительский' # 'и в соответствии с вашим условием' if (item.parent === "#" && item.type! == "folder") { return item; } 'его возвращающийся товар. проблема происходит только с той папкой, которая находится в корне и используется –

ответ

2

Check я сделал много изменений в нем

var data = [{ 
 
    "id": "15", 
 
    "parent": "#", 
 
    "title": "folder 1", 
 
    "type": "folder" 
 
}, { 
 
    "id": "16", 
 
    "parent": "15", 
 
    "title": "file 2", 
 
    "type": "file" 
 
}, { 
 
    "id": "21", 
 
    "parent": "25", 
 
    "title": "file 6", 
 
    "type": "file" 
 
}, { 
 
    "id": "25", 
 
    "parent": "15", 
 
    "title": "folder 10", 
 
    "type": "folder" 
 
}, { 
 
    "id": "33", 
 
    "parent": "#", 
 
    "title": "folder 3", 
 
    "type": "folder" 
 
}, { 
 
    "id": "34", 
 
    "parent": "33", 
 
    "title": "folder 4", 
 
    "type": "folder" 
 
}, { 
 
    "id": "35", 
 
    "parent": "25", 
 
    "title": "file 5", 
 
    "type": "file" 
 
}, { 
 
    "id": "36", 
 
    "parent": "#", 
 
    "title": "file 7", 
 
    "type": "file" 
 
}, { 
 
    "id": "37", 
 
    "parent": "#", 
 
    "title": "folder 8", 
 
    "type": "folder" 
 
}, { 
 
    "id": "38", 
 
    "parent": "#", 
 
    "title": "folder 9", 
 
    "type": "folder" 
 
}, { 
 
    "id": "39", 
 
    "parent": "40", 
 
    "title": "folder 11", 
 
    "type": "folder" 
 
}, { 
 
    "id": "40", 
 
    "parent": "38", 
 
    "title": "folder 12", 
 
    "type": "folder" 
 
}]; 
 

 
function dataFilter(jsonString) { 
 
    function getItemList(item, list) { 
 
     if (item) { 
 
      if (item.type === "folder") { 
 
       var itemFolder = _.findWhere(list, { 
 
        parent: item.id 
 
       }); 
 
       if (itemFolder) { 
 
        return item; 
 
       } 
 
      } else { 
 
       return item; 
 
      } 
 
     } 
 
     return null; 
 
    }; 
 

 
    function removeEmptyFolder(list) { 
 
     var tempItem = null; 
 
     var i; 
 
     for (i = 0; i < list.length; i++) { 
 
      tempItem = getItemList(list[i], list); 
 
      if (tempItem == null) { 
 
       break; 
 
      } 
 
     } 
 
     if (tempItem == null) { 
 
      if (_.size(list) > 0) { 
 
       list.splice(i, 1); 
 
       removeEmptyFolder(list); 
 
      } 
 
     } 
 
     return list; 
 
    }; 
 
    return removeEmptyFolder(jsonString); 
 
} 
 

 

 
$(document).ready(function() { 
 
    var $beforelist = $('#before_json'); 
 
    $.each(data, function() { 
 
     $('<li>' + this.title + '</li>').appendTo($beforelist); 
 
    }); 
 
    var $afterlist = $('#after_json'); 
 
    $.each(dataFilter(data), function() { 
 
     $('<li>' + this.title + '</li>').appendTo($afterlist); 
 
    }); 
 
});
<pre id="before_json"></pre> 
 
<p>After:</p> 
 
<pre id="after_json"></pre> 
 

 

 
<script src="https://code.jquery.com/jquery-3.1.1.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>