Javascript 如何将对象属性添加到状态中的另一个属性?

Javascript 如何将对象属性添加到状态中的另一个属性?,javascript,reactjs,ecmascript-6,redux,Javascript,Reactjs,Ecmascript 6,Redux,我正在我的react redux应用程序中设置操作和还原。我需要一个函数来更新状态中的属性并将对象添加到其列表中,如果可能的话,可以使用扩展语法。以下是我目前掌握的情况: const defaultState = { genres: {} } export default function(state = defaultState, action) { switch(action.type) { case 'ADD_GENRE': return {

我正在我的react redux应用程序中设置操作和还原。我需要一个函数来更新状态中的属性并将对象添加到其列表中,如果可能的话,可以使用扩展语法。以下是我目前掌握的情况:

const defaultState = {
  genres: {}
}

export default function(state = defaultState, action) {
  switch(action.type) {
    case 'ADD_GENRE':
      return {
        ...state,
        genres[action.name]: action.list //new code here
      }
    default:
      return state;
  }
}
我需要像使用属性名的数组一样动态访问“流派”属性,如下所示:

const getMusicFromGenre = (genre) => {
  return state.genres[genre];
}
减速器应接受以下操作,然后相应地修改状态:

// action
{
  type: 'ADD_GENRE,
  name: 'Rock',
  list: ['Bohemian Rhapsody', 'Stairway to Heaven', 'Hotel California']
}

// old state
{
  genres: {
    "Pop": ['Billie Jean', 'Uptown Funk, 'Hey Jude']
  }
}

// new state
{
  genres: {
    "Pop": ['Billie Jean', 'Uptown Funk, 'Hey Jude'],
    "Rock": ['Bohemian Rhapsody', 'Stairway to Heaven', 'Hotel California']
  }
}

如果有必要,我愿意使用不同的方法。

您的方法是正确的,但需要分别处理每一层嵌套。下面是我为之编写的一个示例:


您可能还想阅读我在和上链接的一些关于不可变数据处理的文章。

您的思路是正确的,但需要分别处理每一级别的嵌套。下面是我为之编写的一个示例:

您可能还想阅读我在和上链接的一些关于不可变数据处理的文章。

是进行状态更新的非常有用的库。在您的情况下,它将像这样使用,如果没有现有项,它将创建一个新的数组;如果有预先存在的项,则使用操作的列表连接现有项:

import update from 'immutability-helper';

const defaultState = {
  genres: {}
}

const createOrUpdateList = (prev, list) => {
   if (!Array.isArray(prev)) {
       return list;
   }
   return prev.concat(list);
   // or return [...prev, ...list] if you prefer
}

export default function(state = defaultState, action) {
  switch(action.type) {
    case 'ADD_GENRE':
      return update(state, {
          genres: {
              [action.name]: {
                  $apply: prev => createOrUpdate(prev, action.list)
              }
          }
      });
    default:
      return state;
  }
}
是一个非常有用的库,用于执行状态更新。在您的情况下,它将像这样使用,如果没有现有项,它将创建一个新的数组;如果有预先存在的项,则使用操作的列表连接现有项:

import update from 'immutability-helper';

const defaultState = {
  genres: {}
}

const createOrUpdateList = (prev, list) => {
   if (!Array.isArray(prev)) {
       return list;
   }
   return prev.concat(list);
   // or return [...prev, ...list] if you prefer
}

export default function(state = defaultState, action) {
  switch(action.type) {
    case 'ADD_GENRE':
      return update(state, {
          genres: {
              [action.name]: {
                  $apply: prev => createOrUpdate(prev, action.list)
              }
          }
      });
    default:
      return state;
  }
}

这是一个有用的插件,使代码更易于查看。谢谢这是一个有用的插件,使代码更容易查看。谢谢,我自己也在努力寻找解决方案,但这个问题太难了,无法用谷歌搜索。谢谢你的链接,我肯定会在明天喝一大杯咖啡的时候读到这篇文章。我自己也在努力寻找解决方案,但是这个问题太难了,谷歌无法解决。谢谢你的链接,明天一定会在喝一大杯咖啡的时候读到