我需要一个函数来检查树中是否存在对象。
我递归地遍历树并使用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
。
有人能找到我的问题吗?
答案 0 :(得分:1)
你遗漏了几件事。
false
。true/false
,但未在任何地方使用它,因此objectInResultList
始终返回false。不是使用forEach
,而是使用find
或findIndex
更容易,并使用其结果来确定从objectInResultList
返回的内容。例如,如果find
由于不匹配而返回undefined
,那么您将返回false
。
在这种情况下,您使用的是包含多个列表的树,因此使用find
比findIndex
更有意义。
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);
};