У меня есть сайт, где я хочу фильтровать свои фотографии по тегам. фильтр сделан с флажками, которые генерируются самими тегами.
Я разбиваю код на необходимое:
const [filteredTags, setFilteredTags] = useState();
// {wedding: false, couple: true, NSWF: true} <-this is the ouput of console.info(filteredTags)
const PortfolioData= [
{
name: "John & Johna ",
tag: ["wedding", "couple"],
img: [ src1 , src2, ...] //irrelevant
},
{
name: "Mario & Marie",
tag: ["couple", "NSFW"],
img: [ src1 , src2, ...] //irrelevant
},
];
return(
<>
{PortfolioData
.filter(visible => visible.tag.includes( ??????? )) //<- what to write ?
.map((PortfolioData) => {
return (
<Tile
header = {PortfolioData.name}
imgSrc = {PortfolioData.mainImg[0]}
/>
);
})}
</>
)
Как я могу отфильтровать это?
@CertainPerformance хотя бы один :)
Убедитесь, что .some из итерируемых тегов правдивы в filteredTags объекте. (Чтобы упростить управление, было бы хорошо установить filteredTags, чтобы также иметь начальное значение пустого объекта, а не undefined)
const [filteredTags, setFilteredTags] = useState({});
// for TypeScript:
// const [filteredTags, setFilteredTags] = useState<Record<string, boolean | undefined>>({});
{PortfolioData
.filter(collection => collection.tag.some(tag => filteredTags[tag]))
Я получил ошибку filteredTags is undefindet, поэтому я изменил useState() на useState(''). Теперь, после этого, я получил ошибку из-за того, что элемент [tag] неявно имеет тип «любой», потому что выражение индекса не имеет типа «число».
Это работает, но теперь я должен понять, как так удовлетворить Typescript
Скажите TS, что объект имеет тип Record<string, boolean | undefined> — см. общий синтаксис в ответе — это работает для вас?
Ты волшебник! Спасибо !
Какое сочетание вы хотите? Должны ли присутствовать все true или хотя бы один true?