0

I have an array of objects

let allData = [
  {title:"Adams",age:24,gender:"male"},
  {title:"Baker",age:24,gender:"female"},
  {title:"Clark",age:23,gender:"male"},
  {title:"Davis",age:23,gender:"female"},
  {title:"Ghosh",age:23,gender:"female"},
  {title:"Adams",age:23,gender:"male"},
  {title:"Irwin",age:25,gender:"male"},
]

and list of filter in a Object like this

let filters = {
  title:{filterTerm:[]},
  gender:{filterTerm:["male"]},
  age:{filterTerm:[23]}
}

i want to apply multiple filters on top of allData i tried using Array.some with Array.includes but it is not working when with multiple filters items below is my code

const getFilterRows = (rows, filters) => {
    let filterCols = Object.keys(filters)
    if (filterCols.length == 0) {
        return rows
    }
    else {
        let filteredR = rows.filter(i => {
            return filterCols.some((s) => {
                return filters[s].filterTerm.includes(i[s])
            })
        });
        return filteredR
    }
}
let filterd = getFilterRows(allData,filters)

expected output

[  
 {title:"Clark",age:23,gender:"male"},
 {title:"Adams",age:23,gender:"male"},
]
3
  • 1
    What's your filtering criteria? Is it an OR or an AND condition, i.e. must be "male" AND "23", or "male" OR "23"? Will there be multiple items in the filterTerm subarray? If you do, what does age: { filterTerm: [23, 25] } mean: an age range, or...? Commented Apr 12, 2022 at 20:01
  • And if it's AND, your title filter will filter out everything, since there's nothing to match. You probably want to ignore filters with an empty filterTerm. Commented Apr 12, 2022 at 20:03
  • updated question with expected output Commented Apr 12, 2022 at 20:06

1 Answer 1

1

You could map each key from filters and filter allData based on if filterTerm includes the item being searched, ignoring the filter if filterTerm is empty. Below example would also allow you to add more items to filterTerm if needed.

let allData = [
  {title:"Adams",age:24,gender:"male"},
  {title:"Baker",age:24,gender:"female"},
  {title:"Clark",age:23,gender:"male"},
  {title:"Davis",age:23,gender:"female"},
  {title:"Ghosh",age:23,gender:"female"},
  {title:"Adams",age:23,gender:"male"},
  {title:"Irwin",age:25,gender:"male"}
]

let filters = {
  title:{filterTerm:[]},
  gender:{filterTerm:["male"]},
  age:{filterTerm:[23]},
}

const getFilterRows = (rows, filters) => {
  return rows.filter(row => (
    Object.keys(filters)
      .map(key => filters[key].filterTerm.length ? filters[key].filterTerm.includes(row[key]) : true)
      .every(Boolean))
  )
 }

let filtered = getFilterRows(allData,filters)

console.log(filtered)

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.