Javascript 如何在reducer中的数组索引处添加对象

Javascript 如何在reducer中的数组索引处添加对象,javascript,arrays,redux,react-redux,redux-store,Javascript,Arrays,Redux,React Redux,Redux Store,我有带数组的存储(store.calendar[0]。TODO[{title:title,etc..}]) 我需要将操作对象添加到数组的索引TODO中: 我已尝试使用此减速器,但出现错误: state.calendar[newTodo.day].concat不是函数 我的减速机: let initialState = { calendar: []} for (let i = 1; i <= 30; i++) { initialState.calendar.push({ todos:

我有带数组的存储(
store.calendar[0]。TODO[{title:title,etc..}]

我需要将操作对象添加到数组的索引TODO中: 我已尝试使用此减速器,但出现错误:

state.calendar[newTodo.day].concat不是函数

我的减速机:

let initialState = { calendar: []}

for (let i = 1; i <= 30; i++) {
  initialState.calendar.push({ todos: []});
}

const todosReducer = (state = initialState, action) => {
  switch (action.type) {
    case ADD_TODO:
      const newTodo = action.todoItem;
      const newStore = {...state,
            todos: state.calendar[newTodo.day].concat(newTodo)};
      return newStore;
    default:
      return state
  }
}

export default todosReducer;
我的添加待办事项功能:

const handleSaveTodo = () => {
    props.addTodo({ 
      day: 5,
      title: trackInput.value,
      description: trackTextarea.value,
      completed: false
    });
}

请尝试
state.calendar[newTodo.day].todo.concat(newTodo)
。我认为您正在尝试将.concat()添加到对象{todo:Array(0)}上,而不是其中的数组。

您可以尝试以下操作:

减速器:

const initialState={
日历:数组.from({length:30},()=>({todos:[]}))
}
const todosReducer=(状态=初始状态,操作)=>{
开关(动作类型){
案例添加待办事项:
const{todoItem}=动作;
const newCalendar=[…state.calendar];
newCalendar[todoItem].todos.push(todoItem);
返回{
……国家,
日历:新日历
}
违约:
返回状态
}
}

将默认值导出到dosReducer您需要以完全不变的方式更改您的状态。

为此,您必须复制日历阵列、在此日历中更新的日期以及附加到的待办事项列表

首先获取
日期
待办事项
,您可以使用解构:

const { todoItem } = action;
const { day } = todoItem;
然后复制您的日历,您可以使用spread语法:

const calendar = [...state.calendar];
然后用当天的副本更新相关日期,并将新的todo附加到todo列表中:

calendar[day] = { ...calendar[day], todos: [...calendar[day].todos, todoItem] };
然后返回更新状态:

return { ...state, calendar };
以下是一个例子:
const ADD_TODO='ADD TODO';
const initialState={calendar:Array.from({length:30},(u,i)=>({todos:[]}));
const todosReducer=(状态=初始状态,操作)=>{
开关(动作类型){
案例添加待办事项:
const{todoItem}=动作;
const{day}=todoItem;
const calendar=[…state.calendar];
日历[日]={…日历[日],待办事项:[…日历[日]。待办事项,待办事项]};
返回{…状态,日历};
违约:
返回状态
}
}
让状态=初始状态;
state=todosReducer(state,{type:ADD_TODO,todoItem:{day:0,title:'TODO day 1'}});
state=todosReducer(state,{type:ADD_TODO,todoItem:{day:1,title:'TODO day 2'}});
state=todosReducer(state,{type:ADD_TODO,todoItem:{day:2,title:'TODO day 3'}});
state=todosReducer(state,{type:ADD_TODO,todoItem:{day:2,title:'second TODO day 3'}});
log(state.calendar.slice(0,3))
calendar[day] = { ...calendar[day], todos: [...calendar[day].todos, todoItem] };
return { ...state, calendar };