wallride-match
v1.0.1
Published
Matching and filtering JS objects (with TypeScript typings)
Downloads
1
Maintainers
Readme
wallride-match
Simple and powerful tool for checking if an object matches a pattern. TypeScript module definitions are already provided inside this package.
Basic usage
npm install wallride-match --save
import * as match from 'wallride-match'
const object = {
id: 1,
name: 'Foo'
};
match.check(object, {name:'Foo', id:1});
// returns true - Perfect match!
match.check(object, {id:1});
// returns true - ID is matching, that's enough
match.check(object, {name:'Foo'});
// returns true - Yes, this name fits too
match.check(object, {nonexistent:undefined});
// returns true - Yes, even so. This property is undefined in the provided object
match.check(object, {name:'Bar'});
// returns false - Oh no, that property doesn't match. Bad object!
Going deeper
The filtering object may have nested object that will be matched too.
const object = {
id: 1,
name: {first:'John', last:'Doe'}
};
match.check(object, {name:{}});
// returns true - Indeed. Formally name is an object... :)
match.check(object, {name:{first:'John'}});
// returns true - That guy suits us
match.check(object, {id:1, name:{first:'John', last:'Doe'}});
// returns true - That's the perfect match!
match.check(object, {name:{first:'John', last:'Smith'}});
// returns false - No, he is a stranger
Criteria matchers
Foy your convenience there are special objects (criteria) to determine if a value matches a pattern. They are in development right now, but you can use one universal criterion right away. Just see the following section.
Going more complex
Take a look at CustomCriterion
that uses your function to check values:
const object = {
id: 1,
name: {first:'John', last:'Doe'}
};
match.check(object, {
name: match.criteria.custom( value => {
if (value instanceof Object){
return !!(value.first && value.last)
}
return false;
} )
});
// returns true - Yes. Both first and last names are present. No matter what they are
If you want to make your own criterion you may extend the AbstractCriterion
class
class MyAwesomeCriterion extends match.AbstractCriterion {
check(data: any): boolean {
return true; // whatever
}
}
match.check(someObject, {
name: new MyAwesomeCriterion()
});
Filtering objects
Also you may select matching objects from array like this:
let objects = [
{},
{id:1},
{id:2}
];
match.filter(objects, {id:1})
// returns [{id:1}]
Want more examples? Take a look into tests sources