JavaScript中如何根据对象属性值匹配筛选返回对应对象数组?
原有代码问题点
Object.values(e)返回的是当前对象所有属性值组成的数组,直接和单个值val做全等判断永远不成立,需要先判断数组中是否包含目标值Array.filter()的回调要求返回布尔值来标记当前元素是否符合筛选条件,原代码返回数组result不符合规则,会导致所有元素都被保留- 自定义的
result是函数内部局部变量,外部无法直接访问,且getList函数本身没有返回处理结果,调用后拿不到返回值 - 用法冗余:
filter本身就会返回符合条件的新数组,不需要额外定义空数组手动push元素
修正后代码
const objarr = [ {id:1, email: 'xyz@gmail.com', value: 10, name: 'ram'}, {id:2, email: 'xyz@gmail.com', value: 20, name: 'Tom'}, {id:3, email: 'ss@gmail.com', value: 30, name: 'Lucas'}, {id:4, email: 'ct@gmail.com', value: 40, name: 'Chris'}, {id:5, email: 'tam@gmail.com', value: 30, name: 'Lucas Tim'} ] function getList(val){ // 筛选逻辑:只要对象任意属性值等于传入val就保留 return objarr.filter(item => Object.values(item).includes(val)) } // 测试 console.log(getList('xyz@gmail.com')) console.log(getList('Chris'))
扩展说明
如果需要支持模糊匹配(比如输入Lucas就能同时匹配到Lucas和Lucas Tim两个结果),可以把筛选逻辑改成下面的写法,自动兼容数字、字符串等不同类型的属性值:
function getList(val){ const matchVal = String(val).toLowerCase() return objarr.filter(item => { return Object.values(item).some(v => String(v).toLowerCase().includes(matchVal)) }) }
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

