通过标题和项目描述过滤树视图并显示父项的算法

时间:2018-01-06 13:58:14

标签: javascript json algorithm treeview

我有以下树视图数据:

  [  
    {  
      "id":132,
      "parent_id":0,
      "title":"Item 1",
      "description":"",
      "nodes":[  
        {  
          "id":133,
          "parent_id":132,
          "title":"Item 1.1",
          "description":"",
          "nodes":[  
            {  
              "id":134,
              "parent_id":133,
              "title":"Item 1.1.1",
              "description":"",
              "nodes":[],        
            }
          ]
        }
      ]
    },
    {
      "id":135,
      "parent_id":0,
      "title":"Item 2",
      "description":"",
      "nodes":[  ]
    },
    { 
      "id":136,
      "parent_id":0,
      "title":"Item 3",
      "description":"",
      "nodes":[ 
        { 
          "id":137,
          "parent_id":136,
          "title":"Item 3.1",
          "description":"",
          "nodes":[ ]    
        }
      ]
    }
  ]

我需要按所有子值中的标题和描述进行过滤,如果找到子值,则显示所有父级,以遵循层次结构。

我尝试使用这样的一些,但它只适用于第一个父母的标题:

   this.visible = function (item) {
    return !(this.query && this.query.length > 0 &&
      item.title.indexOf(this.query) == -1);
   };

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样?

var items =   [  
  {  
    "id":132,
    "parent_id":0,
    "title":"Item 1",
    "description":"",
    "nodes":[  
      {  
        "id":133,
        "parent_id":132,
        "title":"Item 1.1",
        "description":"",
        "nodes":[  
          {  
            "id":134,
            "parent_id":133,
            "title":"Item 1.1.1",
            "description":"",
            "nodes":[],        
          }
        ]
      }
    ]
  },
  {
    "id":135,
    "parent_id":0,
    "title":"Item 2",
    "description":"",
    "nodes":[  ]
  },
  { 
    "id":136,
    "parent_id":0,
    "title":"Item 3",
    "description":"",
    "nodes":[ 
      { 
        "id":137,
        "parent_id":136,
        "title":"Item 3.1",
        "description":"",
        "nodes":[ ]    
      }
    ]
  }
];


function filter(queryFunc, items){
  if (!Array.isArray(items)){
    console.error('Items is not an array!');
    return;
  }
    
  if (typeof queryFunc != 'function'){
    console.error('Please provide a query function.');
    return; 
  }
  
  function descend(item, parents){
    let results = [];
    
    if (queryFunc(item))
      results.push([item, parents])
    
    for (let i=0; i<item.nodes.length; i++)
      results = results.concat(
        descend(item.nodes[i], parents.concat([item.id]))
      );
      
    return results;
  }
  
  let results = [];
  
  for (let i=0; i<items.length; i++)
    results = results.concat(descend(items[i], []));
    
  return results;
}


var as = filter(x => /item\s*1/i.test(x.title), items);
var bs = filter(x => x.title == 'Item 3.1', items);

console.log('as:');
as.map(x => console.log(JSON.stringify(x[0]) + '\n\n Parents: '  + JSON.stringify(x[1])));

console.log('bs:');
console.log(JSON.stringify(bs[0][0]) + '\n\nParents: ' + JSON.stringify(bs[0][1]));
/* https://stackoverflow.com/users/1447675/nina-scholz */
.as-console-wrapper { max-height: 100% !important; top: 0; }