Giala Jefferson
Giala Jefferson

Reputation: 1929

filter array of object base on array of object

This is my data

[{name:'james',grade:'A'},
{name:'john',grade:'B'},
{name:'iris',,grade:'A'},
{name:'ivan',,grade:'C'}]

I want to keep object that has grade A and C, it's easy I can just do filter like

person.filter(obj => obj.grade === 'A' || obj.grade === 'C')

but now I have an array of object.

[{grade:'A'},{grade:'C'}]

any clue how can I do filtering now? do I need nested loop?

Upvotes: 1

Views: 87

Answers (5)

Nina Scholz
Nina Scholz

Reputation: 386868

You could use a Set for the predicates and filter accordingly

let person = [{ name: 'james', grade: 'A' }, { name: 'john', grade: 'B' }, { name: 'iris', grade: 'A' }, { name: 'ivan', grade: 'C' }],
    predicate = [{ grade: 'A' }, { grade: 'C' }],
    result = person.filter((s => p => s.has(p.grade))(new Set(predicate.map(p => p.grade))));

console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 0

deceze
deceze

Reputation: 522626

Use Array.prototype.some:

let person = [{name:'james', grade:'A'},
              {name:'john', grade:'B'},
              {name:'iris', grade:'A'},
              {name:'ivan', grade:'C'}];

let predicate = [{grade:'A'},{grade:'C'}];
        
let result = person.filter(obj => predicate.some(p => p.grade == obj.grade))

console.log('result:', result)

If your predicate is more dynamic than that, compare all object properties instead of just p.grade.

person.filter(obj => predicate.some(p => {
    return Object.keys(p).every(k => obj[k] == p[k]);
}));

Upvotes: 1

Yury Tarabanko
Yury Tarabanko

Reputation: 45106

If you have many grades to check (I don't know like all of them ;) ). You could first convert array into Set

const grades = new Set([{grade:'A'},{grade:'C'}].map(({grade}) => grade))

const persons = [{name:'james',grade:'A'},
  {name:'john',grade:'B'},
  {name:'iris',grade:'A'},
  {name:'ivan',grade:'C'}]

And then filter persons array using has

const filtered = persons.filter(({grade}) => grades.has(grade))

Upvotes: 0

marmeladze
marmeladze

Reputation: 6572

Objects having grades A and C should be filtered as (classic js syntax),

var a = [
  {name:'james',grade:'A'},
  {name:'john',grade:'B'},
  {name:'iris',grade:'A'},
  {name:'ivan',grade:'C'}
];

a.filter(function(e) { 
  return (e.grade == 'A') || (e.grade == 'C');
}); 

Upvotes: 0

Rahul Singh
Rahul Singh

Reputation: 19640

Using underscore lib eg -

    var bbb = [
        {id: 839},
        {id: 854}
    ];
     var ids = {};
    _.each(bbb, function (bb) { ids[bb.id] = true; });

var data = [{grade:'A'},{grade:'C'}];
var value = {};
_.each(data , function (d) { value[data.garde] === 'A' | value[data.garde] === 'C' ; });

Upvotes: 0

Related Questions