I have an Immutable OrderedMap as follows:
pairs: Immutable.OrderedMap({"Key1":"Value1","Key2":"Value2","Key4":"Value4"})
I need to insert ["Key3":"Value3"] after ["Key2":"Value2"] dynamically.
I thought
pairs.MergeIn(['Key2'],OrderedMap({"Key3":"Value3"}))
will serve the purpose but not working.
I tried
const newPairs=Immutable.OrderedMap();
newPairs.forEach(function(value,key,map)){
if(key=="Key4")
newPairs.set('Key3','Value3')
newPairs.set(key,value')
});
But I know it's a stupid code which won't work as newPairs is immutable and newPairs will be still empty. So is there any Immutable way of OrderedMap.addBefore(Key,key,value)?
OrderedMap
preserves the order of insertions, so you just need to create a new OrderedMap
where the value is inserted at the correct place:
function printMap(map) {
map.entrySeq().map(([key, val]) => console.log(key, val)).toJS()
}
function insertBefore(map, index, key, val) {
return Immutable.OrderedMap().withMutations(r => {
for ([k, v] of map.entries()) {
if (index === k) {
r.set(key, val)
}
r.set(k, v)
}
});
}
const o1 = Immutable.OrderedMap().set('key1', 'val1').set('key2', 'val2');
printMap(o1)
console.log('now insert before');
printMap(insertBefore(o1, 'key2', 'key1.1', 'val1.1'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>