Генерируемое программой условие
Итак, суть проблемы: можно ли как-то сгенерировать составное условие из нескольких наборов переменных. И если можно, то как это сделать?
Зачем это нужно?
Итак, есть у меня массив обьектов:
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)