2

I have the following array

 let tableA=[{id:'1', name:'name1',age:'31',gender:'male',class='B'},
             {id:'2', name:'name2',age:'38',gender:'male',class='A'},
             {id:'3', name:'name3',age:'35',gender:'male',class='C'},
             {id:'4', name:'name4',age:'20',gender:'female',class='B'},
             {id:'5', name:'name5',age:'19',gender:'female',class='A'},
             {id:'6', name:'name6',age:'31',gender:'male',class='A'}
            ];

and this array for filters

 let filters = [{type:'gender',value:"male"}, {type:'age',value:"31"}];

I'm trying to filter tableA with the values of table filters, all filters must match. Filters are not static, it means that filters can include json files for all table keys.

So far I'm trying to filter table_A with the code above.

 let filtered_table=[];
 tableA.forEach(row => {
    filters.map((item) => {
        if(row[item.type]==item.value){
           filtered_table.push(row);
         }
     });
});
console.log(filtered_table);

the result of the code above is:

 [ { id: '1', name: 'name1', age: '31', gender: 'male', class: 'B' },
   { id: '1', name: 'name1', age: '31', gender: 'male', class: 'B' },
   { id: '2', name: 'name2', age: '38', gender: 'male', class: 'A' },
   { id: '3', name: 'name3', age: '35', gender: 'male', class: 'C' },
   { id: '6', name: 'name6', age: '31', gender: 'male', class: 'A' },
   { id: '6', name: 'name6', age: '31', gender: 'male', class: 'A' } ]

How I can get back only the row that match for all of the filters_table items combined? For this example I'm expecting this:

[ { id: '1', name: 'name1', age: '31', gender: 'male', class: 'B' },
  { id: '6', name: 'name6', age: '31', gender: 'male', class: 'A' } ]

3 Answers 3

3

let filtered_table=[];
 tableA.forEach(row => {
    const flag = filters.map((item) => {
        if(row[item.type]==item.value){
           return 1;
         } else {
           return 0;
         }
     });
     if(flag.filter(el=>el != 1).length==0) {
        filtered_table.push(row);   
     }
});
console.log(filtered_table);

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

Comments

1

Its simple with js .filter(). Check this out Its looping every element in tableA and filter out the gender and the age

 let tableA = [{
     id: '1',
     name: 'name1',
     age: '31',
     gender: 'male',
     class: 'B'
   },
   {
     id: '2',
     name: 'name2',
     age: '38',
     gender: 'male',
     class: 'A'
   },
   {
     id: '3',
     name: 'name3',
     age: '35',
     gender: 'male',
     class: 'C'
   },
   {
     id: '4',
     name: 'name4',
     age: '20',
     gender: 'female',
     class: 'B'
   },
   {
     id: '5',
     name: 'name5',
     age: '19',
     gender: 'female',
     class: 'A'
   },
   {
     id: '6',
     name: 'name6',
     age: '31',
     gender: 'male',
     class: 'A'
   }
 ];
 
 let fil = [{
   type: 'gender',
   value: "male"
 }, {
   type: 'age',
   value: "31"
 }];


const data = tableA.filter((ele,index) => {
    return ele.gender == fil[0].value && ele.age == fil[1].value
})

console.log(data)

Comments

1

The thing you're after is the .every method See Docs.

var filters = [
  { type: "gender", value: "male" },
  { type: "age", value: "31" },
];


var tableA = [
  { id: "1", name: "name1", age: "31", gender: "male", class: "B" },
  { id: "2", name: "name2", age: "38", gender: "male", class: "A" },
  { id: "3", name: "name3", age: "35", gender: "male", class: "C" },
  { id: "4", name: "name4", age: "20", gender: "female", class: "B" },
  { id: "5", name: "name5", age: "19", gender: "female", class: "A" },
  { id: "6", name: "name6", age: "31", gender: "male", class: "A" },
]

var result = tableA.filter(item =>
  filters.every(filter => item[filter.type] === filter.value)
);

console.log(result)

//  [ { id: '1', name: 'name1', age: '31', gender: 'male', class: 'B' },
//    { id: '6', name: 'name6', age: '31', gender: 'male', class: 'A' } ]

Below is a more verbose way, not using the ES6 Syntax:

var result tableA.filter(item => {
  //ensure every filter has been matched against
  var everyFilterMatched = filters.every(filter => {
    return item[filter.type] === filter.value;
  });
  return everyFilterMatched
});

N.B: Edit is use every as I am assuming you may not know how many filters you will have, just that there is an array of the given shape, and you want to match *all of them.

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.