测试树是否包含对象
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
.
有人能找到我的问题吗?
你错过了一些东西。
- 一件小事 - 如果对象不匹配且没有子对象,您的谓词不会 returning
false
。
- 您正在 returning
true/false
谓词,但没有在任何地方使用它,因此 objectInResultList
始终 return 为假。
与使用 forEach
相比,使用 find
or findIndex
更容易,并且使用它的结果来确定从 objectInResultList
到 return 的内容。例如,如果 find
returns undefined
因为没有匹配,那么你 return 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>
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);
};
我需要一个函数来检查树中是否存在对象。
我递归地 运行 通过树并使用 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
.
有人能找到我的问题吗?
你错过了一些东西。
- 一件小事 - 如果对象不匹配且没有子对象,您的谓词不会 returning
false
。 - 您正在 returning
true/false
谓词,但没有在任何地方使用它,因此objectInResultList
始终 return 为假。
与使用 forEach
相比,使用 find
or findIndex
更容易,并且使用它的结果来确定从 objectInResultList
到 return 的内容。例如,如果 find
returns undefined
因为没有匹配,那么你 return 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>
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);
};