我有两个状态,一个有类别,另一个有项目。
我所需要的是一个将两个状态结合起来的最终状态,要么将一个状态合并到另一个状态中,要么创建第三个状态。
类别状态如下所示:
{
category1: { items: [] },
category2: { items: [] }
}
第二个状态是一个项目数组,它看起来像这样:
[
{"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" }}
]
我需要它是这样的:
{
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" }}
]}
}
请帮忙。
这是我尝试过的但没有效果的方法,它要么重复类别并最终得到 3 个“类别 1”和 3 个“类别 2”,要么新项目覆盖以前的项目。
const newFinalList = items.map((item: any) => {
return {[item.itemInfo.category]: {items: [item]}}
})
setFinalState((prevObj: any) => ({ ...prevObj, ...newFinalList }))
问题
问题是数组映射返回一个新数组,但您想要将该数组映射到
categories
状态形状(即对象)。映射逻辑为源数组中的每个项目元素返回一个对象。解决方案
将数组缩减为一个对象。
例子:
如果您使用它来合并一些传递的 props/context 值,则将派生的“状态”也存储到 React 状态中是一种 React 反模式。要么直接计算并使用该值,要么使用钩子
React.useMemo
来计算并提供稳定的参考值。Drew 很好地指出了为什么你现有的尝试不起作用,但是如果你想合并你的第一个状态(类别),以便它包含来自你的项目状态的相应类别的项目。为此,你可以首先使你的项目状态成为一个查找映射,将项目类别映射到项目对象,然后
categories
通过获取它的条目并调用.map()
将项目添加到每个对象来映射你的状态。然后你可以调用Object.fromEntries()
将其转换回对象: