首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减速机被覆盖的更深层次

减速机被覆盖的更深层次
EN

Stack Overflow用户
提问于 2018-05-30 04:23:04
回答 2查看 45关注 0票数 0

我有一个操作,它使用多个调用从数据库中获取一些数据。我试图在还原器中为我的数据创建正确的结构,但是对象的更深层次只是被覆盖。

反应呼叫:

代码语言:javascript
复制
_.forEach(['cat1', 'cat2', 'cat3', 'cat4'], (category) => {
    _.forEach(['day1', 'day2', 'day3'], (day) => {
        this.props.fetchSingleResult('2018', 'USA', day, category)
    })
})

我的行动:

代码语言:javascript
复制
export function fetchSingleResult(year, venue, day, category) {
// Get race result from a single category and day
const request = axios.get('/api/races/singleresult',
    {params: {
        year: year,
        venue: venue,
        day: day,
        category: category }
    });
return {
    type: FETCH_SINGLE_RESULT,
    payload: request,
    meta: {year: year, venue: venue, day: day, category: category}
};
}

我的减速器:

代码语言:javascript
复制
case FETCH_SINGLE_RESULT:
        return {...state,
            [action.meta.year]: {...state[action.meta.year],
                [action.meta.venue]: {...state[action.meta.venue],
                    [action.meta.category]: {...state[action.meta.category],
                        [action.meta.day]: action.payload.data}}}};

它的输出是一个来自此的对象,只有最后一天和类别作为键,即

代码语言:javascript
复制
{2018: {'USA': {'cat4': {'day3' : data}}}}

而不是拥有所有的类别和日子,比如:

代码语言:javascript
复制
{2018: 
    {'USA': 
        {'cat1': {'day1' : data, 'day2' : data, 'day3' : data}}, 
        {'cat2': {'day1' : data, 'day2' : data, 'day3' : data}}, 
        {'cat3': {'day1' : data, 'day2' : data, 'day3' : data}}, 
        {'cat4': {'day1' : data, 'day2' : data, 'day3' : data}}
     }
}

有什么想法吗?

这里有很多年和很多场地。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-30 06:02:56

使用spread运算符的方式导致了这种结果,请尝试:

代码语言:javascript
复制
case FETCH_SINGLE_RESULT: 
  const {year, venue, category, day} = action.meta;
  return _.merge(state, {[year]: {[venue]: {[category]: {[day]: action.payload.data}}}});
票数 1
EN

Stack Overflow用户

发布于 2018-05-30 05:38:53

首先,这种层次的嵌套是很难维护和尊重的不变性的反应。您应该更改数据端点的响应结构。

代码语言:javascript
复制
const getnewState = (state, action) => {
const initialStateValue = {...state }
const { year, venue, day, category } = action.meta
const data = action.payload
  if(initialStateValue[year]) {
    const currentYearValue = initialStateValue[year]
            if (currentYearValue[venue]) {
        const currentVenueValue = currentYearValue[venue]
        if(currentVenueValue[category]) {
          let currentCategoryValue = currentVenueValue[category]
            currentCategoryValue = {
          ...currentCategoryValue,
          [day]: data,
          }
        }
      }
  }
}

我刚刚在上面的代码中处理了一个流程,您需要照顾其他场景,比如,如果关键是它本身,而不是所有级别的。我继续为这一问题编写解决方案,但发现编写代码过于复杂。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50596358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档