可能的重复:在有序映射中添加不可变项.js
使用 redux 存储和不可变 js OrderedMap。
Redux 存储结构:
{
"app": {
"name": "Test app",
"dataPack":{
"chemID": "aaaa",
"item": {
"yp57m359": {
"solid": 33,
"liquid": 45,
"gas": 65
},
"h58wme1y": {
"solid": 87,
"liquid": 9,
"gas": 30
},
"dff56fhh": {
"solid": 76,
"liquid": 43,
"gas": 77
}
}
}
}
}
减速机代码:
return state.setIn(["app","dataPack","item",action.item_id],
fromJS({
"solid": action.soildVal,
"liquid": action.liquidVal,
"gas": action.gasVal
}));
其中action.item_id
是随机 ID(每个项目的键(。
上面的代码非常适合添加项目。
问题是:物品存储在随机位置。我需要保持我添加的顺序。需要将每个项目添加为item
中的最后一个条目。逐个添加项的顺序不同。
帮助我为此获得明确的解决方案。
OrderedMap
会记住你把东西放进去的顺序。每次您在 OrderedMap 上使用新key
调用.set(key, value)
时,它都会添加到末尾。
let state = Immutable.Map({
"app": Immutable.Map({
"name": "Test App",
"dataPack": Immutable.Map({
"chemId": "aaaa",
"items": Immutable.OrderedMap({}) // this is the thing we want ordered
})
})
});
state = state.setIn(['app', 'dataPack', 'items', 'yp57m359'], Immutable.Map({
'first': 'item'
}));
state = state.setIn(['app', 'dataPack', 'items', 'h58wme1y'], Immutable.Map({
'second': 'item'
}));
state = state.setIn(['app', 'dataPack', 'items', 'dff56fhh'], Immutable.Map({
'third': 'item'
}));
console.log(state.toJS()); // notice things are in order
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.js"></script>
很难确切地说出您的问题出在哪里,因为我们看不到您是如何创建商店的,但我的猜测是"item"
指向的是普通的旧Map
而不是OrderedMap
。如果您只是使用 fromJS(data)
来创建状态,它将默认使用 Map
而不是 OrderedMap
。