Генерируемое программой условие

Итак, суть проблемы: можно ли как-то сгенерировать составное условие из нескольких наборов переменных. И если можно, то как это сделать?

Зачем это нужно?

Итак, есть у меня массив обьектов:

let people = [
{gender: 0, adult: 1, work: 0, workPlace: 0},
{gender: 1, adult: 0, work: 0, workPlace: 0},
{gender: 1, adult: 1, work: 1, workPlace: 2},
{gender: 0, adult: 0, work: 1, workPlace: 1},
...
]

Есть у меня элементы select, по которым я могу выбирать конкретные значения свойств обьектов внутри массива:

  <select name="Gender" class="sum2 sum3">
          <option value="X">All</option>
          <option value="0">Male</option>
          <option value="1">Female</option>
        </select>
        <select name="Adult" class="sum2 sum3">
          <option value="X">All</option>
          <option value="1">Adult</option>
          <option value="0">Children</option>
        </select>
        <select name="Work" class="sum2 sum3">
          <option value="X">All</option>
          <option value="1">Yes</option>
          <option value="0">No</option>
        </select>

И вот если значения в элементах select выбраны не ALL, то как бы проблем нет, просто загоняем значения value в условие и делаем проверку массива на совпадения по нужным свойствам.

Но вот с ALL возникает проблема. Так как это значение должно включать в себя все доступные варианты по значению. В теории, нужно просто из условия проверки удалить то свойство, которое имеет значение ALL, но я ума не приложу, как это сделать.

То есть, как удалить из вот этого условия все, что равно ALL, а затем сделать проверку по тому, что осталось? Просто вариантов того, где может быть ALL весьма много получается, а перебирать их все в ручную как-то не очень удобно.

if (gen != ALL && ad == ALL && work == ALL) {
      let i = 0
      let key = 0
      while (i != quality - 1) {
        if (people[key].gender == gen) {
          people[key].workPlace = VEGETABLE
          i++
        }
        key++
      }

Я вот прямо чувствую, что должно быть какое-то простое решение этой проблемы, но никак не могу найти его. По факту должно быть какое-то условие в стиле, если это значение ALL, тогда его не учитыем при проверке массива. Но как это выразить программно?! Хелп!


Ответы (1 шт):

Автор решения: Алексей Р

Можно для каждого параметра сделать составное условие через ИЛИ вида (gen === 'ALL' || el.gender === gen), где в случае 'ALL' условие будет сразу истинно, в ином случае проверяется соответствие конкретному выбору. Потом условия объединить через И и применить фильтр и/или сделать иную необходимую обработку.

let people = [
    {gender: 0, adult: 1, work: 0, workPlace: 0},
    {gender: 1, adult: 0, work: 0, workPlace: 0},
    {gender: 1, adult: 1, work: 1, workPlace: 2},
    {gender: 0, adult: 0, work: 1, workPlace: 1}
]
let gen = 'ALL'
let ad = 0
let work = 'ALL'

const filtered = people.filter((el) => (gen === 'ALL' || el.gender === gen) && (ad === 'ALL' || el.adult === ad) && (work === 'ALL' || el.work === work))
console.log(filtered)

→ Ссылка