Если я правильно понял задачу, то можно вот так.
const Products = ({products, filters}) => {
const filteredProducts = products.filter((product) => {
const currentFilter = filters.promotion.find((filter) => product.id === filter.id);
if (!currentFilter) return true; // or do something else
if (!product.hasOwnProperty(currentFilter.name)) return true;
return product[currentFilter.name] === currentFilter.value;
});
return (
<>
{filteredProducts.map(...)}
</>
);
}
Такое решение будет работать если ваши products и filter.promotion согласуют типы данных. Сейчас у вас каша. products.discount хранит boolean, а filter.promotion[0].value - string. Чтобы корректно сравнить, они должны быть одного типа, ну или определиться какие строковые значения у вас будут означать true, а какие false.