在规范化Redux数据结构中重新排序对象序列



我有一个由字符串ID索引的规范化Redux数据结构。在其他属性中,状态中的每个对象都有一个sequenceNumber,用于在列表或网格中按顺序显示它。可以拖放项目以重新排序。

我正在努力寻找一个整洁,纯粹的方法来更新序列号。在Redux减速器中做这件事的好方法是什么?


我当前的state数据结构基本上是:

{
    'asdf': { title: 'Item 1', sequence: 0, ... },
    '1234': { title: 'Item 2', sequence: 1, ... },
    'zzzz': { title: 'Item 3', sequence: 2, ... }
}

我的动作是

{ type: REORDER_ITEMS, oldRow: 1, newRow: 0 }

结果应该是状态

{
    'asdf': { title: 'Item 1', sequence: 1, ... },
    '1234': { title: 'Item 2', sequence: 0, ... },
    'zzzz': { title: 'Item 3', sequence: 2, ... }
}

我的电流减减器使用Object.keys(state).reduce()循环遍历项目并逐个修改sequence,这取决于它们是否等于、大于或小于所需的行号。有没有更简洁的方法来处理这个问题?

您可以进一步规范化:在单独的状态片中提取序列,并将顺序存储为id数组。

{
  items : {
    'asdf': { title: 'Item 1', ... },
    '1234': { title: 'Item 2', ... },
    'zzzz': { title: 'Item 3', ... }
  },
  sequence: ['1234', 'asdf', 'zzzz']
}

这样,您就可以有一个单独的reducer来处理修改序列的操作,而只使用数组操作。

最新更新