js 数组 如何依次过滤多个动态的条件,请赐教?

一个数组,根据动态条件过滤出想要的数据

数据
let dragList = [
    {name:'张三',age:13,sex:1,height:'172cm'},
    {name:'李二',age:15,sex:1,height:'182cm'},
    {name:'华风',age:13,sex:0,height:'162cm'},
    {name:'黄武',age:12,sex:0,height:'175cm'}
]
            

条件是动态给值的,有可能一个 有可能三个。

let rightFilters = {
    age:13,
    sex:1
}

大概的思路

let list
 for (const key in this.rightFilters) {
        this.rightFilters[key] = this.rightFilters[key]?.toLocaleLowerCase()
        if(this.rightFilters[key]){
            list = this.dragList.filter(item => {
                item[key].toLocaleLowerCase().includes(this.rightFilters[key])
            })

        }
    }

不吝赐教,感谢大神们分享。

阅读 3k
3 个回答
function filterArray(sourceArray, filterObj){
  const filterKeys = Object.keys(filterObj) // 获取到所有筛选属性的key
  // 返回过滤值
  return sourceArray.filter(item => {
    // 短路测试所有筛选属性,这边取非,是因为返回的是有属性不符合筛选条件
    return !filterKeys.some(key => {
      // 判断元素的属性值 是否等于 筛选条件的值
      return item[key] !== filterObj[key]
    })
  })
}

var dragList = [
    {name:'张三',age:13,sex:1,height:'172cm'},
    {name:'李二',age:15,sex:1,height:'182cm'},
    {name:'华风',age:13,sex:0,height:'162cm'},
    {name:'黄武',age:12,sex:0,height:'175cm'}
]
var rightFilters = {
    age:13,
    sex:1
}
filterArray(dragList, rightFilters)
// [{...}]
// 0: {name: '张三', age: 13, sex: 1, height: '172cm'}

简写一下就是这样了

const filterArrayFn = (sourceArray, filterObj) => sourceArray.filter(item => !Object.keys(filterObj).some(key => item[key] !== filterObj[key]))

相关阅读

Array.prototype.filter() - JavaScript | MDN
Array.prototype.some() - JavaScript | MDN
Object.keys() - JavaScript | MDN

这样?

dragList.filter(item => !Object.entries(rightFilters).find(([key, val]) => item[key] !== val))

噢,有个 every 方法。那就不用双重否定了:

dragList.filter(item => Object.entries(rightFilters).every(([key, val]) => item[key] === val))

不知道你有没有用过 node.js 的 orm 框架,你上面的意思就是实现一个不是去数据库查询的 orm 框架,也就是 类似 dragList.where({age: 13})

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题