js - 循环切片并检查数据库中的条目

时间:2015-02-26 14:23:48

标签: javascript meteor

我在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,从它的长度开始,看它是否存在,如果确实存在则返回该对象,如果它没有那么继续检查?

2 个答案:

答案 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
        }
    }
}