#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. вы уверены, что коллекция содержит строки и искомое значение тоже является строкой?