测试Tree是否包含Object

时间:2016-02-22 08:29:04

标签: javascript lodash

我需要一个函数来检查树中是否存在对象。

我递归地遍历树并使用lodash来检查对象是否相等:

var objectInResultList = function (obj, list) {
  list.forEach(function (item) {
    if (_.isEqual(item, obj) === true) {
      return true
    }
    else if (item.children.length > 0) {
      return objectInResultList(obj, item.children);
    }
  });
  return false;
};
          
var item = {"name":"Enterprise1.1","description": "testTest","children":[]};
    
var resultList = [{"name":"Enterprise1.1","description": "testTest","children":[{"name":"Enterprise1.1","description": "testTest","children":[]}]}];
    
var ret = objectInResultList(item, resultList);
alert(ret); 
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.2.1/lodash.min.js"></script>

如果项目在列表中,该函数应返回true,否则返回false,但目前它始终返回false

有人能找到我的问题吗?

JSFiddle

2 个答案:

答案 0 :(得分:1)

你遗漏了几件事。

  1. 一件小事 - 如果对象不匹配且没有子节点,则谓词不会返回false
  2. 您从谓词返回true/false,但未在任何地方使用它,因此objectInResultList始终返回false。
  3. 不是使用forEach,而是使用findfindIndex更容易,并使用其结果来确定从objectInResultList返回的内容。例如,如果find由于不匹配而返回undefined,那么您将返回false

    在这种情况下,您使用的是包含多个列表的树,因此使用findfindIndex更有意义。

    var objectInResultList = function (obj, list) {
      // call find to get the matching object
      var match = list.find(function (item) {
        if (_.isEqual(item, obj) === true) {
          return true;
        }
        else if (item.children.length > 0) {
          return objectInResultList(obj, item.children);
        }
        else {
          return false;
        }
      });
      
      // if match is undefined return false. If we found a match, return true
      return !_.isUndefined(match);
    };
    
    var item = {"name":"Enterprise1.1","description": "testTest","children":[]};
    
    var resultList = [{"name":"Enterprise1.1","description": "testTest","children":[{"name":"Enterprise1.1","description": "testTest","children":[]}]}];
    
    var ret = objectInResultList(item, resultList);
    alert(ret);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.2.1/lodash.min.js"></script>

答案 1 :(得分:0)

forEach()没有返回值,它忽略任何返回的值。所以在搜索函数中返回true或false是没用的。

你应该使用更好的迭代器函数。

var objectInResultList = function (obj, list) {
    function search(item){
        if(item == null) return false;
        if(_.isArray(item)) return _.some(item, search);
        if(_.isEqual(item, obj)) return true;
        return search(item.children);
    }
    return search(list);
};