Estou obtendo dados de uma API no seguinte formato:
const carProperties = [
{
"key": "Brand",
"values": [
{
"id": 1,
"name": "Ford"
},
{
"id": 2,
"name": "Chevy"
},
{
"id": 3,
"name": "Honda",
}
]
},
{
"key": "Color",
"values": [
{
"id": 100,
"name": "Blue"
},
{
"id": 200,
"name": "Red"
},
{
"id": 300,
"name": "White",
}
]
}
]
Preciso filtrar esses dados por seus key
e, em seguida, mapeá-los values
para elementos HTML, como botões de opção, caixas de seleção, etc. Não consigo obter a sintaxe correta para poder mapear os valores. Aqui está o que eu tenho:
carProperties?.filter(property => property.key === "Brand").map((data, index) => (
<Div key={index}>
<Form.Check>
<Form.Check.Input
type="radio"
id={data.values.id.toString()}
value={data.values.name}
/>
<Form.Check.Label className="form-check-label">{data.values.name}</Form.Check.Label>
</Form.Check>
</Div>))
Os tipos para carProperties
são:
export interface CarProperty {
key: string,
values: CarPropertyValue[]
}
export interface CarPropertyValue {
id: number,
name: string,
}
Você precisa mapear os valores, não uma versão filtrada da
carProperties
matriz. Existem algumas maneiras de fazer isso, mas se você puder garantir que há apenas um objeto no seucarProperties
que possui umkey
ofBrand
, então você deve usar.find()
em vez defilter()
. Isso interromperá a pesquisa no array assim que encontrar a propriedade da marca e retornará o objeto que você está procurando.values
, no qual você poderá acessar a propriedade e mapear:O
useMemo()
gancho ajudará a evitar a pesquisa doBrand
objeto em seu array cada vez que seu componente for renderizado novamente e, em vez disso, só o pesquisará uma vez na montagem ou quandocarProperties
for alterado. Então, no seu JSX, você pode mapearbrandProperties.values
assim:Se você puder ter vários objetos com
carProperties
umaBrand
chave, poderá usar um mapa aninhado para mapear avalues
matriz de cada objeto para o seuDiv
: