Как я могу заставить мой фильтр работать как «и» вместо «или», когда есть несколько значений? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть рабочий фильтр с двумя ограничениями.

1: он работает как 'или' вместо 'и', когда есть несколько значений.

например

filterArr = {'claim_number': null, 'status': 'Approved', 'patient': 'John Connor', 'service_date': null}

this.rows = [ 
   { 'claim_number': 1234, 'status': 'Approved', 'patient': 'John Connor', 'service_date': '1/10/2018', etc ...}
   { 'claim_number': 4567, 'status': 'Approved', 'patient': 'James Brown', 'service_date': '3/11/2018', etc ...}
   { 'claim_number': 7890, 'status': 'Approved', 'patient': 'Steven Hawkins', 'service_date': '2/1/2018', etc ...}

В настоящее время все эти элементы будут соответствовать, когда только первый должен, потому что только первый имеет и «статус: одобрен», и «пациент: Джон Коннор».

2: Второе ограничениеЯ хочу инициировать совпадение, когда в this.rows есть частичная строка, совпадающая с полной строкой.

например,

filterArr = {'claim_number': 12, 'status': 'Approved', 'patient': null, 'service_date': null}

this.rows = [ 
    { 'claim_number': 1234, 'status': 'Approved', 'patient': 'John 
       Connor', 'service_date': '1/10/2018', etc ...}
    { 'claim_number': 4567, 'status': 'Approved', 'patient': 'James 
       Brown', 'service_date': '3/11/2018', etc ...}
    { 'claim_number': 7890, 'status': 'Approved', 'patient': 'Steven Hawkins', 'service_date': '2/1/2018', etc ...}

Опять должен совпадать только номер один, так как он содержит правильную "status "и первые две цифры в" request_number ".

Это должно быть относительно просто, поскольку у меня это работало, когда я передавал определенный ключ, но теперь, когда фильтр динамический, он, кажется, неработает правильно.

Я добавил jsFiddle для справки, хотя он не выполняется правильно, потому что я использую Reactive Forms в проекте Angular.Также, пожалуйста, включайте только ответы, которые решаются с использованием ES5 или ES6.Я не могу использовать flatMap () и другие экспериментальные функции.Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Это ответ, который я в конечном итоге использовал.Я нашел это самым простым.

@Input() filters: Array<any>;
allRows: Array<any> = [];

applyFilters() {
    this.rows = this.allRows;

    this.rows = this.rows.filter(row => {
        for (let filter of this.filters) {
            const filterVal = this.filtersForm.get(filter.key).value;
            const rowVal = row[filter.key];

            if (!!filterVal && rowVal.toString().toLowerCase().includes(filterVal.toString().toLowerCase())) {
                return true;
            }
        }

        return false;
    })
}
0 голосов
/ 06 декабря 2018

Посмотрите, будет ли это работать для вас:

const rows = [ { 'claim_number': '1234', 'status': 'Approved', 'patient': 'John Connor', 'service_date': '1/10/2018'}, { 'claim_number': '4567', 'status': 'Approved', 'patient': 'James Brown', 'service_date': '3/11/2018'}, { 'claim_number': '7890', 'status': 'Approved', 'patient': 'Steven Hawkins', 'service_date': '2/1/2018'} ]

const filtrate = (i, f) => {
  const vals = Object.values(f).reduce((r,c) => (!!c ? r.push(c) : 0, r), [])
  return vals.every(x => Object.values(i).some(y => y.includes(x)))
}
const filterBy = (arr, f) => arr.filter(x => filtrate(x, f))

console.log(filterBy(rows, {'claim_number': null, 'status': 'Approved', 'patient': 'John Connor', 'service_date': null}))
console.log(filterBy(rows, {'claim_number': '12', 'status': 'Approved', 'patient': null, 'service_date': null}))

Идея состоит в том, чтобы сначала clean/sanitize отфильтровать объект, а когда у вас есть только чистые значения, тогда фактически выполнить весь поиск с помощью Array.every & Array.some & Array.includes.

Также обратите внимание, что я преобразовал числа в строки, поскольку кажется, что вы намерены искать, если 12 является частью 1234 и т. Д.

Здесь то же самоекод расширен для ясности:

const rows = [ { 'claim_number': '1234', 'status': 'Approved', 'patient': 'John Connor', 'service_date': '1/10/2018'}, { 'claim_number': '4567', 'status': 'Approved', 'patient': 'James Brown', 'service_date': '3/11/2018'}, { 'claim_number': '7890', 'status': 'Approved', 'patient': 'Steven Hawkins', 'service_date': '2/1/2018'} ]

const filtrate = (item, filter) => {
  const values = Object.values(filter).reduce((accumulator, current) => {
  if(!!current)
    accumulator.push(current) 
    return accumulator
  }, [])
  return values.every(value => {
    return Object.values(item).some(itm => itm.includes(value))
  })
}
const filterBy = (allRows, filterObject) => {
  return allRows.filter(row => filtrate(row, filterObject))
}

console.log(filterBy(rows, {'claim_number': null, 'status': 'Approved', 'patient': 'John Connor', 'service_date': null}))
console.log(filterBy(rows, {'claim_number': '12', 'status': 'Approved', 'patient': null, 'service_date': null}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...