【问题标题】:Javascript loop not returning true, when String === String当 String === String 时,Javascript 循环不返回 true
【发布时间】:2019-03-13 14:12:39
【问题描述】:

当循环遍历数组以查找数组是否包含我要查找的单词时,如果我 console.log out 正在比较的内容,则循环始终返回“false”,我可以清楚地看到单词 I am寻找 (collectionNameLookingFor) 在数组 (collectionNameArray) 中,所以它应该返回 true。

function checkCollectionNames(arrayOfCollections, collectionName) {
  for (let i = 0; i < arrayofCollections.length; i++) {
    if (arrayOfCollections[i] === collectionName) {
      return true;
    }
  }
  return false;
}

function saveContentToDb(req, res) {
  const db = getDb();
  const pageDetails = req.body;
  let saveType;

  db.db(pageDetails.databaseName).listCollections().toArray((error, collections) => {
    if (error) {
      throw error;
    } else {
      collections.map(collection => (collection.name)).forEach(collectionNameArray => {
        const collectionNameLookingFor = req.body.page;
        const check = checkCollectionNames(collectionNameArray, collectionNameLookingFor);

        console.log('===========Looking to see if it is true or false==========');
        console.log(check);
        console.log(`Name of collection in Database: ${collectionNameArray} ::: ${collectionNameLookingFor}`);
        console.log('==========================================================');
        if (check === true) {
          saveType = 'updated';
          console.log(`saveType = ${saveType}`);
        } else {
          saveType = 'created';
          console.log(`saveType = ${saveType}`);
        }
      });
    }
  });
}

【问题讨论】:

  • checkCollectionNames 有一个名为arrayOfCollections 的第一个参数,但您在函数本身中将其简称为array。这些肯定应该匹配吗?
  • 您是否考虑过使用Array.prototype.includes 方法而不是自己编写?
  • 应该是collectionName 而不是page
  • 您能否检查一下数组的元素是字符串还是对象。使用“console.log(typeof array[i])”。因为您可以使用 new String(...) 以对象的形式创建字符串。
  • 如果数组元素是对象,那么使用 "==" 而不是 "===" 就可以了。

标签: javascript arrays node.js mongodb


【解决方案1】:

您可能需要检查collectionName,因为这是您在arrayOfCollections 旁边传递的参数,而不是array 本身。

function checkCollectionNames(arrayOfCollections, collectionName) {
    for (let i = 0; i < arrayOfCollections.length; i++) {
        if (arrayOfCollections[i] === collectionName) {
            return true;
        }
    }
    return false;
}

短版:

function checkCollectionNames(arrayOfCollections, collectionName) {
    return arrayOfCollections.includes(collectionName);
}

【讨论】:

  • 复制到问题中时出现错误。我已编辑问题以解决此问题。
  • 注销时数组中有 5 个值,匹配的值返回 true,例如saveType = '更新'。但是一旦它返回 true 它就不会中断,因此循环继续进行并最终返回 false,例如saveType = 'created' 因为最终值为 False。
  • 您确定该集合包含字符串并且想要的值也是字符串吗?
猜你喜欢
  • 1970-01-01
  • 2021-11-25
  • 2014-12-20
  • 2010-12-28
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
相关资源
最近更新 更多