Javascript 如何使我的过滤器作为一个“过滤器”工作;及;而不是",;或;当有多个值时?

Javascript 如何使我的过滤器作为一个“过滤器”工作;及;而不是",;或;当有多个值时?,javascript,arrays,filter,angular-reactive-forms,Javascript,Arrays,Filter,Angular Reactive Forms,我有一个工作过滤器,有两个限制 1:当有多个值时,它作为“或”而不是“和” e、 g 目前,当只有第一个项目应该匹配时,所有这些项目都会匹配,因为只有第一个项目同时具有“状态:已批准”和“患者:John Connor” 2:第二个限制是,当存在与this.rows中的完整字符串匹配的部分字符串时,我希望触发匹配 e、 g 同样,只有数字1应该匹配,因为它包含正确的“状态”和“索赔编号”中的前两位数字 这应该是相对简单的,因为当我传递一个特定的键时,它可以工作,但是现在过滤器是动态的,它似乎不能正

我有一个工作过滤器,有两个限制

1:当有多个值时,它作为“或”而不是“和”

e、 g

目前,当只有第一个项目应该匹配时,所有这些项目都会匹配,因为只有第一个项目同时具有“状态:已批准”和“患者:John Connor”

2:第二个限制是,当存在与this.rows中的完整字符串匹配的部分字符串时,我希望触发匹配

e、 g

同样,只有数字1应该匹配,因为它包含正确的“状态”和“索赔编号”中的前两位数字

这应该是相对简单的,因为当我传递一个特定的键时,它可以工作,但是现在过滤器是动态的,它似乎不能正常工作


我附加了一个供参考,尽管它执行不正确,因为我在一个角度项目中使用了被动形式。此外,请仅包括使用ES5或ES6解决的答案。我不能使用flatMap()和其他实验特性。多谢各位

看看这是否适合您:

const rows=[{‘索赔编号’:‘1234’,‘状态’:‘批准’,‘患者’:‘约翰·康纳’,‘服务日期’:‘2018年10月1日’,{‘索赔编号’:‘4567’,‘状态’:‘批准’,‘患者’:‘詹姆斯·布朗’,‘服务日期’:‘2018年11月3日’,{‘索赔编号’:‘7890’,‘状态’:‘批准’,‘患者’:‘史蒂文·霍金斯’,‘服务日期’:‘2018年1月2日’]
常量滤液=(i,f)=>{
const vals=Object.values(f).reduce((r,c)=>(!!c?r.push(c):0,r),[]))
返回vals.every(x=>Object.values(i).some(y=>y.includes(x)))
}
常数过滤器比=(arr,f)=>arr.filter(x=>filter(x,f))
log(filterBy(行,{'claim_number':null,'status':'Approved','patient':'John Connor','service_date':null}))

log(filterBy(行,{'claim_number':'12','status':'Approved','patient':null,'service_date':null}))
这是我最终使用的答案。我发现这是最直接的

@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;
    })
}
@Input()过滤器:数组;
allRows:Array=[];
applyFilters(){
this.rows=this.allRows;
this.rows=this.rows.filter(row=>{
for(让此.filters的筛选器){
const filterVal=this.filtersForm.get(filter.key).value;
const rowVal=行[filter.key];
if(!!filterVal&&rowVal.toString().toLowerCase().includes(filterVal.toString().toLowerCase())){
返回true;
}
}
返回false;
})
}

Akrion,谢谢你的回答,但在我的代码中它似乎不起作用。我不知道如何应用这个,你的答案有点简洁,尤其是“常量过滤”。我不明白r和c是什么?我添加了一个扩展版本。让我知道,如果这是一个更清楚,并为你工作。
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 ...}
@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;
    })
}