在 React 中使用 useContext 和 useReducer 创建新的键值对

Posted

技术标签:

【中文标题】在 React 中使用 useContext 和 useReducer 创建新的键值对【英文标题】:Create new key-value pairs using useContext and useReducer in React 【发布时间】:2021-09-11 07:11:30 【问题描述】:

我正在使用 useEffect 从 API 获取数据,这些数据正在通过调用调度函数来更新我的应用程序的上下文。

我想要更新上下文的同一个 reducer 函数,以便在我的响应对象中计算一些新的键值对。

响应对象是一个对象列表,每个对象应该多一个键值对。

API 响应如下所示:

[ID:'500T',
  values:[ 0 : percentage: 0.4, cycles: 11400, hours: 212,
           1 : percentage: 0.6, cycles: 12900, hours: 243,
           2 : percentage: 0.3, cycles: 10100, hours: 197],

 ID:'584T',
  values:[ 0 : percentage: 0.8, cycles: 18400, hours: 277,
           1 : percentage: 0.4, cycles: 10500, hours: 184,
           2 : percentage: 0.9, cycles: 23100, hours: 306],

 ID:'551T',
  values:[ 0 : percentage: 0.2, cycles: 10400, hours: 177,
           1 : percentage: 0.1, cycles: 10500, hours: 184,
           2 : percentage: 0.4, cycles: 20100, hours: 106]]

我要做的是将此列表交给另一个函数,该函数将为每个函数创建另一个键值对,计算最大“百分比”并存储它。请参阅下文以获得更清晰的信息。

[ID:'500T',
  values:[ 0 : percentage: 0.4, cycles: 11400, hours: 212,
           1 : percentage: 0.6, cycles: 12900, hours: 243,
           2 : percentage: 0.3, cycles: 10100, hours: 197],
  maxPercentage: 0.6,

 ID:'584T',
  values:[ 0 : percentage: 0.8, cycles: 18400, hours: 277,
           1 : percentage: 0.4, cycles: 10500, hours: 184,
           2 : percentage: 0.9, cycles: 23100, hours: 306],
  maxPercentage: 0.9,

 ID:'551T',
  values:[ 0 : percentage: 0.2, cycles: 10400, hours: 177,
           1 : percentage: 0.1, cycles: 10500, hours: 184,
           2 : percentage: 0.4, cycles: 20100, hours: 106],
  maxPercentage: 0.4]

提前感谢您的帮助

【问题讨论】:

【参考方案1】:

将数据映射到一个新数组。在映射过程中,将values 数组映射到一个百分比数组并传播到Math.max 以返回最大值。浅拷贝当前的obj 元素并添加一个新的maximumPercentage 键/值属性。

const res = data.map((obj) => (
  ...obj,
  maxPercentage: Math.max(...obj.values.map(( percentage ) => percentage))
));

const data = [
  
    ID: "500T",
    values: [
       percentage: 0.4, cycles: 11400, hours: 212 ,
       percentage: 0.6, cycles: 12900, hours: 243 ,
       percentage: 0.3, cycles: 10100, hours: 197 
    ]
  ,
  
    ID: "584T",
    values: [
       percentage: 0.8, cycles: 18400, hours: 277 ,
       percentage: 0.4, cycles: 10500, hours: 184 ,
       percentage: 0.9, cycles: 23100, hours: 306 
    ]
  ,
  
    ID: "551T",
    values: [
       percentage: 0.2, cycles: 10400, hours: 177 ,
       percentage: 0.1, cycles: 10500, hours: 184 ,
       percentage: 0.4, cycles: 20100, hours: 106 
    ]
  
];

const res = data.map((obj) => (
  ...obj,
  maxPercentage: Math.max(...obj.values.map(( percentage ) => percentage))
));

console.log(res);

【讨论】:

这正是我想要做的!非常感谢你。不确定这属于“高级”还是“中级”,但我什至不知道如何用谷歌搜索。 @ortunoa 哪个方面?将一个数组映射到下一个以添加属性,还是从数组中计算最大值?我会说这些是知识项目的基本水平,但它更像是了解/学习如何将问题分解为更容易解决的较小部分。 是的,所有的组合,解构然后创建映射到函数的新键值对。我想它只是有一堆活动部件,使它有点混乱,但它就像一个魅力。我猜这会返回一个数组,对吗? ( ...obj.values.map(( percent ) => percent) ) @ortunoa Affirmative, obj.values.map(( percentage ) => percentage) 生成一个百分比值数组,即[0.4, 0.6, 0.8, ....] 并将其传播到Math.max 中传递所有值,即就像您调用了Math.max(0.4, 0.6, 0.8, ....) 不会忘记这个,在我来到这里之前花了我将近 2 个小时的头撞。再次感谢。

以上是关于在 React 中使用 useContext 和 useReducer 创建新的键值对的主要内容,如果未能解决你的问题,请参考以下文章

react中 useContext 和useReducer的使用

从 REST API 填充上下文并在带有 useEffect 和 useContext 的 React 组件中使用它

React Context 和 useContext

React.useContext() 不断返回未定义?

使用 React useContext 和 useReducer 时出现打字稿错误

我需要使用 useContext 和 map 函数更新 React 中的数组状态