Функция поиска мангуста, есть ли значение для$, в котором было бы верно, несмотря ни на что?

#javascript #mongodb #mongoose

Вопрос:

Извините за плохо сформулированный вопрос..
Вот код:

 module.exports.getUserByQuery = function (params, callback) {
  if (params.nationality.length !== 0 amp;amp; params.languages.length !== 0) {
    User.find(
      {
        age: {
          $gt: params.minAge,
          $lt: params.maxAge,
        },
        nationality: { $in: paramas.nationality},
        languages: { $in: params.languages },
      },
      callback
    );
  } else if (params.nationality.length === 0 amp;amp; params.languages.length === 0) {
    User.find(
      {
        age: {
          $gt: params.minAge,
          $lt: params.maxAge,
        },
      },
      callback
    );
  } else if (params.nationality.length !== 0 amp;amp; params.languages.length === 0) {
    User.find(
      {
        age: {
          $gt: params.minAge,
          $lt: params.maxAge,
        },
        nationality: { $in: params.nationality },
      },
      callback
    );
  } else if (params.nationality.length === 0 amp;amp; params.languages.length !== 0) {
    User.find(
      {
        age: {
          $gt: params.minAge,
          $lt: params.maxAge,
        },
        languages: { $in: params.languages },
      },
      callback
    );
  }
};
 

Параметры.национальность и язык могут быть пустым строковым массивом, если пользователь веб-сайта не выбрал значение в поисковой системе.

Есть ли значение, которое я мог бы установить для них, чтобы фильтр действовал так, как если бы его не существовало?
Я в основном ищу способ избавиться от «если».

Ответ №1:

Я не думаю, что вы можете полностью устранить эти условия, но вы можете структурировать свой код так, чтобы он был более управляемым (например):

 let params = { minAge: 10, maxAge: 12, nationality: [ ], languages: [ ] }

const filterBuilder = function(params) {

    const f1 = {
        age: {
            $gt: params.minAge,
            $lt: params.maxAge
        }
    }
    const f2 = { nationality: { $in: params.nationality } }
    const f3 = { languages: { $in: params.languages } }

    if (params.languages.length !== 0 amp;amp; params.nationality.length !== 0) {
         Object.assign(f1, f2, f3);
    } else if (params.languages.length !== 0) {
         Object.assign(f1, f3);
    } else if (params.nationality.length !== 0) {
         Object.assign(f1, f2);
    }

    return f1;
}

User.find(filterBuilder(params), callback);