Как добавить пару ключ-значение в качестве последней записи в 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,

Другие вопросы по тегам