// your code goes here
function Person(name, gender, maritalStatus) {
this.name = name;
this.gender = gender;
this.maritalStatus = maritalStatus;
}
const maleCriteria = {
filter: (people) => people.filter(person => person.gender === 'Male')
};
const singleCriteria = {
filter: (people) => people.filter(person => person.maritalStatus === 'Single')
};
const andCriteria = (criteria1, criteria2) => ({
filter: (people) => criteria2.filter(criteria1.filter(people))
});
const orCriteria = (criteria1, criteria2) => ({
filter: (people) => {
const firstFiltered = criteria1.filter(people);
const secondFiltered = criteria2.filter(people);
return [...new Set([...firstFiltered, ...secondFiltered])];
}
});
const people = [
new Person("Robert", "Male", "Single"),
new Person("John", "Male", "Married"),
new Person("Laura", "Female", "Married"),
new Person("Diana", "Female", "Single")
];
const singleMaleCriteria = andCriteria(maleCriteria, singleCriteria);
const singleMales = singleMaleCriteria.filter(people);
console.log(JSON.stringify(singleMales));
// Expected output: [ Person { name: 'Robert', gender: 'Male', maritalStatus: 'Single' } ]
Ly8geW91ciBjb2RlIGdvZXMgaGVyZQoKCiAgICBmdW5jdGlvbiBQZXJzb24obmFtZSwgZ2VuZGVyLCBtYXJpdGFsU3RhdHVzKSB7CiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICB0aGlzLmdlbmRlciA9IGdlbmRlcjsKICAgICAgICB0aGlzLm1hcml0YWxTdGF0dXMgPSBtYXJpdGFsU3RhdHVzOwogICAgfQogICAgCiAgICBjb25zdCBtYWxlQ3JpdGVyaWEgPSB7CiAgICAgICAgZmlsdGVyOiAocGVvcGxlKSA9PiBwZW9wbGUuZmlsdGVyKHBlcnNvbiA9PiBwZXJzb24uZ2VuZGVyID09PSAnTWFsZScpCiAgICB9OwoKICAgIGNvbnN0IHNpbmdsZUNyaXRlcmlhID0gewogICAgICAgIGZpbHRlcjogKHBlb3BsZSkgPT4gcGVvcGxlLmZpbHRlcihwZXJzb24gPT4gcGVyc29uLm1hcml0YWxTdGF0dXMgPT09ICdTaW5nbGUnKQogICAgfTsKICAgIAogICAgY29uc3QgYW5kQ3JpdGVyaWEgPSAoY3JpdGVyaWExLCBjcml0ZXJpYTIpID0+ICh7CiAgICAgICAgZmlsdGVyOiAocGVvcGxlKSA9PiBjcml0ZXJpYTIuZmlsdGVyKGNyaXRlcmlhMS5maWx0ZXIocGVvcGxlKSkKICAgIH0pOwoKICAgIGNvbnN0IG9yQ3JpdGVyaWEgPSAoY3JpdGVyaWExLCBjcml0ZXJpYTIpID0+ICh7CiAgICAgICAgZmlsdGVyOiAocGVvcGxlKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGZpcnN0RmlsdGVyZWQgPSBjcml0ZXJpYTEuZmlsdGVyKHBlb3BsZSk7CiAgICAgICAgICAgIGNvbnN0IHNlY29uZEZpbHRlcmVkID0gY3JpdGVyaWEyLmZpbHRlcihwZW9wbGUpOwogICAgICAgICAgICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmZpcnN0RmlsdGVyZWQsIC4uLnNlY29uZEZpbHRlcmVkXSldOwogICAgICAgIH0KICAgIH0pOwogICAgCiAgICBjb25zdCBwZW9wbGUgPSBbCiAgICAgICAgbmV3IFBlcnNvbigiUm9iZXJ0IiwgIk1hbGUiLCAiU2luZ2xlIiksCiAgICAgICAgbmV3IFBlcnNvbigiSm9obiIsICJNYWxlIiwgIk1hcnJpZWQiKSwKICAgICAgICBuZXcgUGVyc29uKCJMYXVyYSIsICJGZW1hbGUiLCAiTWFycmllZCIpLAogICAgICAgIG5ldyBQZXJzb24oIkRpYW5hIiwgIkZlbWFsZSIsICJTaW5nbGUiKQogICAgXTsKCiAgICBjb25zdCBzaW5nbGVNYWxlQ3JpdGVyaWEgPSBhbmRDcml0ZXJpYShtYWxlQ3JpdGVyaWEsIHNpbmdsZUNyaXRlcmlhKTsKICAgIGNvbnN0IHNpbmdsZU1hbGVzID0gc2luZ2xlTWFsZUNyaXRlcmlhLmZpbHRlcihwZW9wbGUpOwoKICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHNpbmdsZU1hbGVzKSk7CiAgICAvLyBFeHBlY3RlZCBvdXRwdXQ6IFsgUGVyc29uIHsgbmFtZTogJ1JvYmVydCcsIGdlbmRlcjogJ01hbGUnLCBtYXJpdGFsU3RhdHVzOiAnU2luZ2xlJyB9IF0=