2016-11-11 9 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'は、要素"フォルダ11 "を削除します。 2回目の呼び出しが再帰を介して機能した後、フォルダ "12"の要素が削除されます。この関数が3回目に呼び出されると、アイテム ""フォルダ9 "には子が含まれていません。 –

+1

'folder 9'はフォルダで親 '#'があり、あなたの状態に応じて 'if(item.parent ==="# "&& item.type!==" folder "){ return item; } 'その返品アイテム。ルートにあり、emplyであるフォルダだけに問題が起きています –

答えて

2

チェック私はそれ

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>

関連する問題