测试树是否包含对象

Test if Tree contains Object

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

我递归地 运行 通过树并使用 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>

如果项目在列表中,函数应该 return true,否则 return false,但目前它总是 returns false.

有人能找到我的问题吗?

JSFiddle

你错过了一些东西。

  1. 一件小事 - 如果对象不匹配且没有子对象,您的谓词不会 returning false
  2. 您正在 returning true/false 谓词,但没有在任何地方使用它,因此 objectInResultList 始终 return 为假。

与使用 forEach 相比,使用 find or findIndex 更容易,并且使用它的结果来确定从 objectInResultList 到 return 的内容。例如,如果 find returns undefined 因为没有匹配,那么你 return 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>

forEach() 没有 return 值,它会忽略任何 returned 值。所以 return 在搜索功能中设置 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);
};