Как я понимаю, вы хотите объединить и заменить state.UserChangedData.changedData на action.payload на основе их значений идентификатора.
Вы можете использовать следующий редуктор для достижения того, что вы хотите:
const rootReducer = (state = initialState, action) => {
switch (action.type) {
case SET_USER_BUCKET_LIST_DATA:
let updatedChangeData = Object.values(
[]
.concat(state.UserChangedData.changedData, action.payload)
.reduce(
(r, c) => ((r[c.id] = Object.assign(r[c.id] || {}, c)), r),
{}
)
);
return {
...state,
UserChangedData: {
...state.UserChangedData,
changedData: updatedChangeData
}
};
default:
return state;
}
};
Идея взята из этого поста:
Как объединить и заменить объекты из двух массивов на основе ключа в JavaScript?
Вот полный кодиграть с ним в автономном приложении узла:
const redux = require("redux");
const createStore = redux.createStore;
const SET_USER_BUCKET_LIST_DATA = "SET_USER_BUCKET_LIST_DATA";
const initialState = {
UserChangedData: {
changedData: []
}
};
const rootReducer = (state = initialState, action) => {
switch (action.type) {
case SET_USER_BUCKET_LIST_DATA:
let updatedChangeData = Object.values(
[]
.concat(state.UserChangedData.changedData, action.payload)
.reduce(
(r, c) => ((r[c.id] = Object.assign(r[c.id] || {}, c)), r),
{}
)
);
return {
...state,
UserChangedData: {
...state.UserChangedData,
changedData: updatedChangeData
}
};
default:
return state;
}
};
const store = createStore(rootReducer);
store.subscribe(() => {
console.log("[Subscription]", store.getState().UserChangedData.changedData);
});
store.dispatch({
type: SET_USER_BUCKET_LIST_DATA,
payload: [{ id: 1, title: "A" }]
});
store.dispatch({
type: SET_USER_BUCKET_LIST_DATA,
payload: [{ id: 2, title: "B" }]
});
store.dispatch({
type: SET_USER_BUCKET_LIST_DATA,
payload: [{ id: 1, title: "AA" }]
});