Цикл Javascript не возвращает true, когда String === Строка

#javascript #arrays #node.js #mongodb

#javascript #массивы #node.js #mongodb

Вопрос:

При циклическом просмотре массива, чтобы найти, содержит ли массив слово, которое я ищу, цикл всегда возвращает ‘false’, когда я выполняю консоль.выйдите из того, что сравнивается, я могу ясно видеть, что слово, которое я ищу (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}`);
        }
      });
    }
  });
}
  

Комментарии:

1. checkCollectionNames вызывается первый параметр arrayOfCollections , но вы ссылаетесь на него в самой функции просто array . Конечно, они должны совпадать?

2. Рассматривали ли вы возможность использования Array.prototype.includes метода вместо написания собственного?

3. Должно ли это быть collectionName вместо page ?

4. Не могли бы вы, пожалуйста, проверить, являются ли элементы массива строкой или объектом. используйте «console.log(typeof array[i])». Потому что вы можете создать строку в форме объекта, используя new String(…).

5. Если элементы массива являются объектами, то использование «==» вместо «===» выполнит свою работу.

Ответ №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);
}
  

Комментарии:

1. Это была ошибка при копировании в вопрос. Я отредактировал вопрос, чтобы исправить это.

2. При выходе из системы в массиве есть 5 значений, и то, которое соответствует, возвращает true, например saveType = ‘обновлено’. Но как только он возвращает true, он не прерывается, поэтому цикл продолжается и в конечном итоге возвращает false, например saveType = ‘created’, потому что конечное значение равно False.

3. вы уверены, что коллекция содержит строки и искомое значение тоже является строкой?