使用JavaScript过滤多个参数?

使用JavaScript过滤多个参数?,javascript,Javascript,我有一个需要过滤的对象数组 如果对象的活动值为true,则无论其他因素如何,都应始终返回该值 如果输入了searchText,则列表的其余部分应通过此搜索文本进行过滤 如果输入了countrySearch,则列表应按此值过滤,如果提供了searchText,还应按searchText过滤 const searchText = 'Di'; const countrySearch = "USA"; const myArray = [ { name: "Tom",

我有一个需要过滤的对象数组

如果对象的活动值为true,则无论其他因素如何,都应始终返回该值

如果输入了searchText,则列表的其余部分应通过此搜索文本进行过滤

如果输入了countrySearch,则列表应按此值过滤,如果提供了searchText,还应按searchText过滤

const searchText = 'Di';
const countrySearch = "USA";

const myArray = [
    {
        name: "Tom",
        country: "UK",
        active: true
    },
    {
        name: "Dick",
        country: "USA",
        active: false
    },
    {
        name: "Dimmon",
        country: "FR",
        active: false
    }
].filter(item => { 
    if (item.active === true) {
        return true;
    }
  if (searchText) {
    if(item.name.includes(searchText)) {
      return true;
    }
  }
});

console.log(myArray);
在本例中,新数组应包含Tom,因为active为true。它应该包含迪克,因为他通过了searchText和countrySearch测试。Dimmon不应该出现在新数组中,因为他只传递了一个searchText和countrySearch搜索条件

我可以用目前的方法来解决这个问题,但是嵌套的if语句会让问题变得一团糟。而且,随着时间的推移,我的搜索条件可能会变得越来越复杂。这是函数式编程的好例子吗

试试看:

.filter(item => { 
    if (
            (item.active === true) ||
            (searchText && item.name.includes(searchText))
    ) {
        return true;
    }
  }
})
尝试:


根据您的搜索方法,您可以将代码简化如下

第一次搜索将条件与OR子句联接。它只是查看
active
属性设置为
true
name属性包含Dilexem的对象数组-因此所有三个对象都匹配

第二个也执行相同的操作,但这次使用子句,结果是空数组。因为没有一个对象同时在这两种条件下都起作用

const searchText='Di';
const countrySearch=“美国”;
常量myArray=[
{
姓名:“汤姆”,
国家:“英国”,
主动:正确
},
{
名字:“迪克”,
国家:“美国”,
活动:错误
},
{
名称:“迪蒙”,
国家:“FR”,
活动:错误
}
]
console.log('或')
log(myArray.filter(e=>e.active | | e.name.includes(searchText));
console.log('AND')

log(myArray.filter(e=>e.active&&e.name.includes(searchText))根据您的搜索方法,您可以按如下方式简化代码

第一次搜索将条件与OR子句联接。它只是查看
active
属性设置为
true
name属性包含Dilexem的对象数组-因此所有三个对象都匹配

第二个也执行相同的操作,但这次使用子句,结果是空数组。因为没有一个对象同时在这两种条件下都起作用

const searchText='Di';
const countrySearch=“美国”;
常量myArray=[
{
姓名:“汤姆”,
国家:“英国”,
主动:正确
},
{
名字:“迪克”,
国家:“美国”,
活动:错误
},
{
名称:“迪蒙”,
国家:“FR”,
活动:错误
}
]
console.log('或')
log(myArray.filter(e=>e.active | | e.name.includes(searchText));
console.log('AND')

log(myArray.filter(e=>e.active&&e.name.includes(searchText))给定您可以使用的预期逻辑
活动
国家搜索
国家搜索
等于
国家搜索
搜索文本
名称
.includes()
搜索文本
搜索文本
国家搜索
名称
.includes(),
搜索文本
国家搜索
国家搜索
等于
国家

const searchText='Di';
const countrySearch=“美国”;
常量myArray=[{
姓名:“汤姆”,
国家:“英国”,
主动:正确
},
{
名字:“迪克”,
国家:“美国”,
活动:错误
},
{
名称:“迪蒙”,
国家:“FR”,
活动:错误
}
]
.filter({active,name,country})=>
活跃的
||countrySearch&&countrySearch==国家
&&searchText&&name.includes(searchText)
||searchText&!countrySearch&&name.includes(searchText)
||!searchText&&countrySearch&&countrySearch==国家
);

log(myArray)给定您可以使用的预期逻辑
活动
国家搜索
国家搜索
等于
国家搜索
搜索文本
名称
.includes()
搜索文本
搜索文本
国家搜索
名称
.includes(),
搜索文本
国家搜索
国家搜索
等于
国家

const searchText='Di';
const countrySearch=“美国”;
常量myArray=[{
姓名:“汤姆”,
国家:“英国”,
主动:正确
},
{
名字:“迪克”,
国家:“美国”,
活动:错误
},
{
名称:“迪蒙”,
国家:“FR”,
活动:错误
}
]
.filter({active,name,country})=>
活跃的
||countrySearch&&countrySearch==国家
&&searchText&&name.includes(searchText)
||searchText&!countrySearch&&name.includes(searchText)
||!searchText&&countrySearch&&countrySearch==国家
);

log(myArray)这里有另一种方法,您可以使用

  • 可以使用任意数量的过滤器
  • 输入数组将只被遍历一次
const comp=(f,g)=>
x=>f(g(x))
常量组合=(…fs)=>
fs.reduce(comp,x=>x)
常量附加=(xs,x)=
const searchText = 'Di';
        const countrySearch = "USA";
        const myArray = [
            {
                name: "Tom",
                country: "UK",
                active: true
            },
            {
                name: "Dick",
                country: "USA",
                active: false
            },
            {
                name: "Dimmon",
                country: "FR",
                active: false
            }
        ]
        function getFilterResult(b, c) {
            return myArray.filter(function(a, d) {
           // if countrySearch is undefined then return only active & name
           // which pass the searchText, else return where all the conditions match
                return void 0 === c ? a.active || a.name.includes(b) : 
                a.active || a.name.includes(b) && a.country === c;
            });
        };
    console.log(getFilterResult(searchText,countrySearch));