筛选嵌套对象以返回所有子元素

时间:2017-10-04 15:45:57

标签: angularjs angular-filters

我有一个ng-repeat上的过滤器,并将所有对象(包括嵌套的对象)的字符串与搜索字符串进行比较。如果在对象中找到搜索字符串,则返回true。

我正在寻找一种扩展此功能的方法,以便当搜索字符串与对象中的字符串匹配时,过滤器将为该对象返回true,并对匹配对象中的所有嵌套对象返回true(this是树视图,我正在搜索节点,并希望在匹配时显示所有子节点。

我该怎么做?

我的过滤器如下所示:

 .filter('deepFilter', function ($filter) {
    return function(text) {
       return function (value) {
            if(text && text.length > 0) {
              var searchTerm = text;
              if (angular.isObject(value)) {
                  var found = false;
                  angular.forEach(value, function(v) {
                      found = found || $filter('deepFilter')(searchTerm)(v);
                  });
                  return found;

              } else if (angular.isString(value)) {
                  if (value.indexOf(searchTerm) !== -1) {
                      return true;
                  } else {
                      return false;
                  }
              }
            } else {
              return true;
            }
        };
     };
   });

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是使用过滤器的isString部分中的函数,并迭代集合。如果我找到了这个对象,我会使用递归函数查找它的子项并为它们设置visibleAsAChild属性。然后,我在isObject评估中添加了一个条件,以返回true这些具有visibleAsAChild道具的对象。 我不确定这是否是最有效的方法,但它肯定有效。

.filter('deepFilter', function ($filter) {
var currentObject;
var setChildrenToVisible = function(node) {
  angular.forEach(node.nodes, function(node) {
    if(node.nodes) {
      setChildrenToVisible(node);
    }
    node.visibleAsAChild = true;
  });
};
var lookupChildren = function(o, value) {
  // console.log(o);
  angular.forEach(o.nodes, function(node) {
    if (node.name === value) {
      setChildrenToVisible(node);
    }
  });
};

return function(text) {

   return function (value) {

        if(text && text.length > 0) {
          var searchTerm = text;
          if (angular.isObject(value)) {
              var found = false;
              angular.forEach(value, function(v) {
                found = found || $filter('deepFilter')(searchTerm)(v);
              });
              if(found && value.hasOwnProperty('id')) {
                currentObject = value;
              }
              if(value.hasOwnProperty('id') && value.visibleAsAChild) {
                return true;
              }
              return found;

          } else if (angular.isString(value)) {
              if (value.indexOf(searchTerm) !== -1) {
                if(currentObject){
                  lookupChildren(currentObject, value);
                }
                  return true;
              } else {
                  return false;
              }
          }
        } else {
          return true;
        }
    };
 };