对数组对象的任意多条件查询

  const arr = [
    {
      name: "zhao",
      age: 18,
      gender: "male",
      status: "teacher",
      income: "1000",
    },
    {
      name: "zhao",
      age: 20,
      gender: "female",
      status: "banker",
      income: "2000",
    },
    {
      name: "zhao",
      age: 20,
      gender: "male",
      status: "teacher",
      income: "3000",
    },
   ......
  ];

以上面的数组为例,想实现对该数组进行任意单一条件或组合条件查询, 条件是数组中对象的属性名。如我想查询name =zhao, 可得到3条数据,若想再加一个age=20,就可以得到第二条数据,再加一个条件gender=female,就得到第三条.

  const arr = [
    {
      name: "zhao",
      age: 18,
      gender: "male",
      status: "teacher",
      income: "1000",
    },
    {
      name: "zhao",
      age: 20,
      gender: "female",
      status: "banker",
      income: "2000",
    },
    {
      name: "zhao",
      age: 20,
      gender: "male",
      status: "teacher",
      income: "3000",
    }
  ];
  
  
function test(params){ return  arr.filter(item=>Object.keys(params).map(key=>params[key]==item[key]).filter(key=>!key).length==0) }
console.log(test({name:'zhao'}))
console.log(test({name:'zhao',age:20}))
console.log(test({name:'zhao',age:20,status: "teacher"}))
const arr = [
  {
    name: "zhao",
    age: 18,
    gender: "male",
    status: "teacher",
    income: "1000",
  },
  {
    name: "zhao",
    age: 20,
    gender: "female",
    status: "banker",
    income: "2000",
  },
  {
    name: "zhao",
    age: 20,
    gender: "male",
    status: "teacher",
    income: "3000",
  },
];

function query(data, condition) {
  if (!condition) return data
  return data.filter(item => {
    for (const key in condition) {
      if (item[key] !== condition[key]) return false
    }
    return true
  })
}

console.log(query(arr, {
  name: 'zhao',
  age: 20,
  gender: 'female'
}));

应该没啥问题

const arr = [
    {
        name: "zhao",
        age: 18,
        gender: "male",
        status: "teacher",
        income: "1000",
    },
    {
        name: "zhao",
        age: 20,
        gender: "female",
        status: "banker",
        income: "2000",
    },
    {
        name: "zhao",
        age: 20,
        gender: "male",
        status: "teacher",
        income: "3000",
    },
];


function getData(arr, query) {
    //arr是要查询的数组
    //query是条件

    //如果arr不是数组或者query不是对象返回空数组
    if (!Array.isArray(arr) || query.constructor !== Object) {
        return []
    }

    //获取对象的所有key
    let queryKes = Object.keys(query)
    console.log("keys:", queryKes)


    //是数组、是对象的情况
    return arr.filter(item => {
        //判断查询条件的所有的key是否都有
        let itemKeys = Object.keys(item)  // name、age、gender ....

        //如果查询条件对象的key有一个不在数组元素对象的key里 或者查询条件的key多于数组元素的key
        if (queryKes.findIndex(e => !itemKeys.includes(e)) !== -1 || queryKes.length > itemKeys.length) {
            return false
        } else {
            //这里queryKes key的个数小于等于itemKeys key的个数
            return queryKes.every(e => item[e] == query[e])
        }
    })

}

// arr不是数组
console.log("arr不是数组:", getData(1, {
    age: 18
}))

//arr是数组、query是对象 一个条件
console.log("arr是数组、query是对象,一个条件:", getData(arr, {
    age: 18
}))

//多个条件
console.log("多个条件", getData(arr, {
    name: 'zhao',
    age: 20
}))   

结果:

img

其实js有这方面的库,库肯定更加准确,考虑的更加全面,可以直接用https://www.lodashjs.com/

img

已经过运行测试,结果没问题,希望采纳,谢谢

img

const arr = [
    {
      name: "zhao",
      age: 18,
      gender: "male",
      status: "teacher",
      income: "1000",
    },
    {
      name: "zhao",
      age: 20,
      gender: "female",
      status: "banker",
      income: "2000",
    },
    {
      name: "zhao",
      age: 20,
      gender: "male",
      status: "teacher",
      income: "3000",
    },
  ];
// 查询的条件
let filters = [
  {name:"zhao"},
  {age:20},
];
let filterList = arr.filter((item) => {
  let isShow = filters.every((prop) => {
    let key = Object.keys(prop)[0];
    let value = prop[key];
    return item.hasOwnProperty(key) && item[key] == value;
  })
  return isShow;
})
console.log(filterList)