简体   繁体   English

如何根据父ID级别[ag-grid]对行类别数据进行排序

[英]How to sort row category data based on parent id with level [ag-grid]

I'm trying to sort hierarchal category object based on parent id and then based on there level with in that displaying it along with it's parent. 我正在尝试根据父级ID对层次结构类别对象进行排序,然后根据在其中与父级一起显示它的层次进行排序。

Here is my object look like 这是我的对象看起来像

[{category_id: "168"
category_level: "1"
category_name: "Home"
parent_id: "1"},

{category_id: "166"
category_level: "1"
category_name: "Living"
parent_id: "1"},

{category_id: "171"
category_level: "2"
category_name: "Chairs"
parent_id: "168"},

{category_id: "172"
category_level: "3"
category_name: "Single Sofa"
parent_id: "170"},

{category_id: "169"
category_level: "1"
category_name: "Patio"
parent_id: "1"},

{category_id: "170"
category_level: "2"
category_name: "Sofa"
parent_id: "166"},

]

** JSON Expected output** ** JSON预期输出**

[{category_id: "168"
category_level: "1"
category_name: "Home"
parent_id: "1"},

{category_id: "169"
category_level: "1"
category_name: "Patio"
parent_id: "1"},

{category_id: "166"
category_level: "1"
category_name: "Living"
parent_id: "1"},


{category_id: "170"
category_level: "2"
category_name: "Sofa"
parent_id: "166"},

{category_id: "172"
category_level: "3"
category_name: "Single Sofa"
parent_id: "170"},

{category_id: "171"
category_level: "2"
category_name: "Chairs"
parent_id: "168"}]

Output Should look like 输出应该看起来像

Home
Patio
Living
Living >> Sofa
Living >> Sofa >> Single Sofa
Living >> Chairs

I'm using here ag-grid and tried solving it by lodash.js Here is my code I used to render cell in column definition: 我在这里使用ag-grid并尝试通过lodash.js解决它。这是我用来在列定义中呈现单元格的代码:

var columnDefs = [
    {headerName: "", field: "icon", width:52},
    {headerName: "Categories",field:"category_name", width:1000, cellRenderer:function(params){

      function getParentIndex(pid)
      {
        var index = $scope.categories.map(function(el){
            return el.category_id;
        }).indexOf(pid);
        return index
      }

      var val="", parentIndex = getParentIndex(params.data.parent_id);

      if(parentIndex > -1)
      {

        val = $scope.categories[parentIndex].category_name + " >> " +params.data.category_name;
        var grandParentIndex = getParentIndex($scope.categories[parentIndex].parent_id);
        if(grandParentIndex > -1)
        {
          val = $scope.categories[grandParentIndex].category_name + " >> " + val;
        }
      }
      else {
        val = params.data.category_name;
      }
      return val;
    }},

    {headerName: "", field: "options", width:87, suppressMenu: true, onCellClicked(params){
      $scope.modifyOptions(params.data);
    }, template:"<a class='btn' href='javascript:void(0)'>options</a>"
  }
];

Above code concatenate string well but still need to sort it as shown in output. 上面的代码很好地连接了字符串,但是仍然需要对它进行排序,如输出所示。 Here is my lodash.js code that short well but only with single category. 这是我的lodash.js代码,虽然简短,但仅包含一个类别。

var parentId = 1;
  var sortedList = [];
  var byParentsIdsList = _.groupBy(scope.categories, "parent_id"); // Create a new array with objects indexed by parentId

        while (byParentsIdsList[parentId]) {
            sortedList.push(byParentsIdsList[parentId][0]);
            parentId = byParentsIdsList[parentId][0].category_id;
        }


  scope.categories = sortedList;

I suggest to build a tree first and then iterate over the branches and build a map for mapping the sorted result. 我建议先构建一棵树,然后遍历分支,并构建用于映射排序结果的映射

 var data = [{ category_id: "168", category_level: "1", category_name: "Home", parent_id: "1" }, { category_id: "166", category_level: "1", category_name: "Living", parent_id: "1" }, { category_id: "171", category_level: "2", category_name: "Chairs", parent_id: "168" }, { category_id: "172", category_level: "3", category_name: "Single Sofa", parent_id: "170" }, { category_id: "169", category_level: "1", category_name: "Patio", parent_id: "1" }, { category_id: "170", category_level: "2", category_name: "Sofa", parent_id: "166" }, ], sorted, tree = {}, map = []; data.forEach(function (a, i) { tree[a.category_id] = tree[a.category_id] || {}; tree[a.category_id].category_id = a.category_id; tree[a.category_id].index = i; tree[a.parent_id] = tree[a.parent_id] || {}; tree[a.parent_id].children = tree[a.parent_id].children || []; tree[a.parent_id].children.push(tree[a.category_id]); }); function getChildren(o) { o.children.forEach(function (a) { map.push(a.index); a.children && getChildren(a); }); } getChildren(tree[1]); // assuming it starts with parent_id 1 sorted = map.map(function (a) { return data[a]; }); document.write('<pre>' + JSON.stringify(sorted, 0, 4) + '</pre>'); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM