Tenho dois estados, um tem categorias e o outro tem itens.
tudo o que preciso é de um estado final que combine os dois estados, seja fundindo um no outro ou criando um terceiro estado.
o estado das categorias se parece com isto:
{
category1: { items: [] },
category2: { items: [] }
}
e o segundo estado é uma matriz de itens e se parece com isto:
[
{"id": "1", itemInfo: { name: "itemName", category: "category1" }},
{"id": "2", itemInfo: { name: "itemName", category: "category1" }},
{"id": "3", itemInfo: { name: "itemName", category: "category2" }},
{"id": "4", itemInfo: { name: "itemName", category: "category1" }},
{"id": "5", itemInfo: { name: "itemName", category: "category2" }},
{"id": "6", itemInfo: { name: "itemName", category: "category2" }}
]
preciso que seja assim:
{
category1: { items: [
{"id": "1", itemInfo: { name: "itemName", category: "category1" }},
{"id": "2", itemInfo: { name: "itemName", category: "category1" }},
{"id": "4", itemInfo: { name: "itemName", category: "category1" }}
]},
category2: { items: [
{"id": "3", itemInfo: { name: "itemName", category: "category2" }},
{"id": "5", itemInfo: { name: "itemName", category: "category2" }},
{"id": "6", itemInfo: { name: "itemName", category: "category2" }}
]}
}
ajuda. por favor.
foi isso que tentei e não funcionou, ou duplica as categorias e acabo com 3 "categoria1" e 3 "categoria2" ou os novos itens substituem os itens anteriores.
const newFinalList = items.map((item: any) => {
return {[item.itemInfo.category]: {items: [item]}}
})
setFinalState((prevObj: any) => ({ ...prevObj, ...newFinalList }))
Emitir
O problema é que o mapeamento de array retorna um novo array, mas você quer mapear o array para o
categories
formato de estado que é um objeto. A lógica de mapeamento retorna um objeto para cada elemento de item no array de origem.Solução
Reduza a matriz em um objeto.
Exemplo:
Se você estiver usando isso para mesclar alguns valores de props/context passados, é um antipadrão do React também armazenar esse "estado" derivado no estado do React. Calcule e use o valor diretamente, ou use o
React.useMemo
hook para calcular e fornecer um valor de referência estável.Drew bem apontou por que sua tentativa existente não funciona, mas se você quiser mesclar seu primeiro estado (categorias), para que ele inclua os itens com as respectivas categorias do seu estado de itens. Para fazer isso, você pode primeiro fazer do seu estado de itens um mapa de consulta que mapeia as categorias de itens para os objetos de itens e, em seguida, mapear por meio do seu
categories
estado, pegando as entradas dele e chamando.map()
para adicionar os itens a cada objeto. Você pode então chamarObject.fromEntries()
para convertê-lo de volta em um objeto: