Функции some, filter и find all принимают функцию с одинаковой сигнатурой.Функция, переданная некоторым, фильтрует и находит, получает элемент массива и возвращает true или false.
Затем вы можете использовать частично примененные функции и комбинировать их, чтобы легко создавать комбинируемые фильтры, пример того, как это используетсяможно найти здесь
Если вам нужно объединить фильтры, я бы посоветовал взглянуть на код ниже, там нет комментариев, объясняющих, но вы можете найти больше информации о том, как это работает впример фильтра, упомянутый ранее.
const infos = [
{
"resourceName": "name1",
"id": "id1",
"emailAddresses": [
{ "metadata": { "primary": true, "source": { "type": "CONTACT", "id": "m1" }, "value": "email1@example.com" } },
{ "metadata": { "primary": false, "source": { "type": "CONTACT", "id": "m2" }, "value": "email2@example.com" } }
]
},
{
"resourceName": "name2",
"id": "id2",
"emailAddresses": [
{ "metadata": { "primary": true, "source": { "type": "FAMILY", "id": "m3" }, "value": "email3@example.com" } },
{ "metadata": { "primary": false, "source": { "type": "CONTACT", "id": "m4" }, "value": "email4@example.com" } },
{ "metadata": { "primary": false, "source": { "type": "BUSINESS", "id": "m5" }, "value": "email5@example.com" } }
]
},
{
"resourceName": "name3",
"id": "id3",
"emailAddresses": [
{ "metadata": { "primary": true, "source": { "type": "CONTACT", "id": "m5" }, "value": "email6@example.com" } },
{ "metadata": { "primary": false, "source": { "type": "FAMILY", "id": "m6" }, "value": "email7@example.com" } }
]
}
];
const filterFn = getter => comparer => o =>
comparer(getter(o))
;
const getEmailAddresses = o => (o && o.emailAddresses) || [];
const getType = o => o.metadata.source.type;
const getEmail = o => o.metadata.value;
const getPrimary = o => String(o.metadata.primary);
const isEqual = value => item => item === value;
const compareEmail = comparers => items =>
items.some(
item=>
comparers.reduce(
(result,comparer)=>result && comparer(item),
true
)
)
;
const getters = [getPrimary,getType,getEmail];
Array.from(document.querySelectorAll("select")).forEach(
select=>{
select.addEventListener(
"change",
()=>{
const filters = Array.from(document.querySelectorAll("select")).map(
(select,index)=>
(select.value==="none")
? x=>true
: filterFn(getters[index])(isEqual(select.value))
);
console.log(
infos.filter(filterFn(getEmailAddresses)(compareEmail(filters)))
.map(item=>item.resourceName)
);
}
)
}
)
<select>
<option value="none">no filter on primary</option>
<option value="true">primary</option>
<option value="false">not primary</option>
</select>
<select>
<option value="none">no filter on type</option>
<option value="CONTACT">CONTACT</option>
<option value="FAMILY">FAMILY</option>
<option value="BUSINESS">BUSINESS</option>
</select>
<select>
<option value="none">no filter on email</option>
<option value="email1@example.com">email1@example.com</option>
<option value="email2@example.com">email2@example.com</option>
<option value="email3@example.com">email3@example.com</option>
<option value="email4@example.com">email4@example.com</option>
<option value="email5@example.com">email5@example.com</option>
<option value="email6@example.com">email6@example.com</option>
<option value="email7@example.com">email7@example.com</option>
</select>