Как добавить пару ключ-значение в качестве последней записи в OrderedMap..?
Возможный дубликат: Добавьте элемент в OrderedMap с помощью Immutable.js
Работа с избыточным магазином и неизменным 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
случайный идентификатор (ключ для каждого элемента).
Приведенный выше код отлично работает для добавления элементов.
Проблема в том, что предметы хранятся в случайном порядке. Мне нужно сохранить порядок, который я добавляю. Необходимо добавить каждый элемент как последнюю запись внутри item
, Добавление одного за другим не в том же порядке.
Помогите мне получить четкое решение для этого.
1 ответ
OrderedMap
будет помнить порядок вы положили вещи в нем. Каждый раз, когда вы звоните .set(key, value)
с новым key
в OrderedMap он будет добавлен в конец.
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
,