我在meteor工作,并且有一个传递字符串参数的函数。我想查看该字符串是否存在于mongo集合中,如果它没有开始切片,查看string.length-1是否存在,如果不存在,则查看string.length-2等,直到查找字符串中的所有字符为止如果它不存在则返回false。
我使用对象大小函数来检查返回的对象是否有任何属性(即它是否在db中找到)但代码看起来非常难看并且计算成本高昂,因为我必须查询数据库str.length次数,然后检查这些条目是否存在...
所以我有这样的事情:
checkString = function (str) {
var result = myCollection.findOne({name: str});
var result1 = myCollection.findOne({name: str.slice(0,(str.length - 1)});
// ...
if (Object.size(result) > 0) {
return result;
else if (Object.size(result1) > 0 {
return result1;
...
// this is getting messy already
}
我怎样才能有效地遍历str,从它的长度开始,看它是否存在,如果确实存在则返回该对象,如果它没有那么继续检查?
答案 0 :(得分:0)
为什么不把搜索放在循环中?像这样:
checkString = function(str)
{
var result;
for (loopIndex = 0; loopIndex < str.length; loopIndex++)
{
if (loopIndex = 0)
{
//Takes the full string
result = myCollection.findOne({name: str});
} else {
//Takes a smaller string
result = myCollection.findOne({name: str.slice(0,(str.length - loopIndex)});
}
if (Object.size(result) > 0)
{
//Stop with looping because an entry has being found
break;
}
}
return result;
}
注意:请不要问我关于流星本身的问题。对于这种情况,请创建新问题。
答案 1 :(得分:0)
我希望我的问题是正确的。这应该可以解决您的问题:
checkString = function(str) {
for (i = str.length; i > 0; i--) {
var result = myCollection.findOne({
name: str.slice(0, i)
})
if (result) {
return result
}
}
}