删除阵列中没有子项的所有元素

问题描述:

我以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'移除元素''文件夹11“'后。第二次调用函数通过递归发生''文件夹12“'元素移除。当第三次调用该函数时,文件夹“9”没有包含子项。 –

+1

由于'文件夹9'是一个文件夹,并有父''',并根据您的条件'if(item.parent ===“#”&& item.type!==“文件夹”){ return item; }它的返回项目。问题只发生在那些位于根目录的文件夹中 –

检查我对此非常

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>