Creates a new Immutable OrderedMap.
Created with the same key value pairs as the provided Collection.Keyed or JavaScript Object or expects a Collection of [K, V] tuple entries.
The iteration order of key-value pairs provided to this constructor will be preserved in the OrderedMap.
let newOrderedMap = OrderedMap({key: "value"})
let newOrderedMap = OrderedMap([["key", "value"]])
Note: OrderedMap
is a factory function and not a class, and does not use
the new
keyword during construction.
Creates a new Immutable OrderedMap.
Created with the same key value pairs as the provided Collection.Keyed or JavaScript Object or expects a Collection of [K, V] tuple entries.
The iteration order of key-value pairs provided to this constructor will be preserved in the OrderedMap.
let newOrderedMap = OrderedMap({key: "value"})
let newOrderedMap = OrderedMap([["key", "value"]])
Note: OrderedMap
is a factory function and not a class, and does not use
the new
keyword during construction.
Creates a new Immutable OrderedMap.
Created with the same key value pairs as the provided Collection.Keyed or JavaScript Object or expects a Collection of [K, V] tuple entries.
The iteration order of key-value pairs provided to this constructor will be preserved in the OrderedMap.
let newOrderedMap = OrderedMap({key: "value"})
let newOrderedMap = OrderedMap([["key", "value"]])
Note: OrderedMap
is a factory function and not a class, and does not use
the new
keyword during construction.
Creates a new Immutable OrderedMap.
Created with the same key value pairs as the provided Collection.Keyed or JavaScript Object or expects a Collection of [K, V] tuple entries.
The iteration order of key-value pairs provided to this constructor will be preserved in the OrderedMap.
let newOrderedMap = OrderedMap({key: "value"})
let newOrderedMap = OrderedMap([["key", "value"]])
Note: OrderedMap
is a factory function and not a class, and does not use
the new
keyword during construction.
The number of entries in this OrderedMap.
True if the provided value is an OrderedMap.
Creates a Collection.Keyed
Similar to Collection()
, however it expects collection-likes of [K, V]
tuples if not constructed from a Collection.Keyed or JS Object.
Note: Collection.Keyed
is a conversion function and not a class, and
does not use the new
keyword during construction.
Creates a new Immutable Map.
Created with the same key value pairs as the provided Collection.Keyed or JavaScript Object or expects a Collection of [K, V] tuple entries.
Note: Map
is a factory function and not a class, and does not use the
new
keyword during construction.
const { Map } = require('immutable')
Map({ key: "value" })
Map([ [ "key", "value" ] ])
Keep in mind, when using JS objects to construct Immutable Maps, that JavaScript Object properties are always strings, even if written in a quote-less shorthand, while Immutable Maps accept keys of any type.
let obj = { 1: "one" }
Object.keys(obj) // [ "1" ]
assert.equal(obj["1"], obj[1]) // "one" === "one"
let map = Map(obj)
assert.notEqual(map.get("1"), map.get(1)) // "one" !== undefined
Property access for JavaScript Objects first converts the key to a string,
but since Immutable Map keys can be of any type the argument to get()
is
not altered.
The yin to asMutable
's yang. Because it applies to mutable collections,
this operation is mutable and may return itself (though may not
return itself, i.e. if the result is an empty collection). Once
performed, the original mutable copy must no longer be mutated since it
may be the immutable result.
If possible, use withMutations
to work with temporary mutable copies as
it provides an easier to use API and considers many common optimizations.
Another way to avoid creation of intermediate Immutable maps is to create
a mutable copy of this collection. Mutable copies always return this
,
and thus shouldn't be used for equality. Your function should never return
a mutable copy of a collection, only use it internally to create a new
collection.
If possible, use withMutations
to work with temporary mutable copies as
it provides an easier to use API and considers many common optimizations.
Note: if the collection is already mutable, asMutable
returns itself.
Note: Not all methods can be used on a mutable collection or within
withMutations
! Read the documentation for each method to see if it
is safe to use in withMutations
.
Returns a new Map containing no keys or values.
const { Map } = require('immutable')
Map({ key: 'value' }).clear()
// Map {}
Note: clear
can be used in withMutations
.
Returns a new Map which excludes this key
.
Note: delete
cannot be safely used in IE8, but is provided to mirror
the ES6 collection API.
const { Map } = require('immutable')
const originalMap = Map({
key: 'value',
otherKey: 'other value'
})
// Map { "key": "value", "otherKey": "other value" }
originalMap.delete('otherKey')
// Map { "key": "value" }
Note: delete
can be used in withMutations
.
Returns a new Map which excludes the provided keys
.
const { Map } = require('immutable')
const names = Map({ a: "Aaron", b: "Barry", c: "Connor" })
names.deleteAll([ 'a', 'c' ])
// Map { "b": "Barry" }
Note: deleteAll
can be used in withMutations
.
Returns a new Map having removed the value at this keyPath
. If any keys
in keyPath
do not exist, no change will occur.
Note: deleteIn
can be used in withMutations
.
Returns a new OrderedMap with only the entries for which the predicate
function returns true.
Note: filter()
always returns a new instance, even if it results in
not filtering out any values.
Flat-maps the OrderedMap, returning a new OrderedMap.
Similar to data.map(...).flatten(true)
.
True if the provided value is a Map
const { Map } = require('immutable')
Map.isMap({}) // false
Map.isMap(Map()) // true
Returns a new OrderedMap with values passed through a
mapper
function.
OrderedMap({ a: 1, b: 2 }).map(x => 10 * x)
// OrderedMap { "a": 10, "b": 20 }
Note: map()
always returns a new instance, even if it produced the same
value at every step.
Returns a new OrderedMap resulting from merging the provided Collections (or JS objects) into this OrderedMap. In other words, this takes each entry of each collection and sets it on this OrderedMap.
Note: Values provided to merge
are shallowly converted before being
merged. No nested values are altered.
const { OrderedMap } = require('immutable')
const one = OrderedMap({ a: 10, b: 20, c: 30 })
const two = OrderedMap({ b: 40, a: 50, d: 60 })
one.merge(two) // OrderedMap { "a": 50, "b": 40, "c": 30, "d": 60 }
two.merge(one) // OrderedMap { "b": 20, "a": 10, "d": 60, "c": 30 }
Note: merge
can be used in withMutations
.
Like merge()
, but when two Collections conflict, it merges them as well,
recursing deeply through the nested data.
Note: Values provided to merge
are shallowly converted before being
merged. No nested values are altered unless they will also be merged at
a deeper level.
const { Map } = require('immutable')
const one = Map({ a: Map({ x: 10, y: 10 }), b: Map({ x: 20, y: 50 }) })
const two = Map({ a: Map({ x: 2 }), b: Map({ y: 5 }), c: Map({ z: 3 }) })
one.mergeDeep(two)
// Map {
// "a": Map { "x": 2, "y": 10 },
// "b": Map { "x": 20, "y": 5 },
// "c": Map { "z": 3 }
// }
Note: mergeDeep
can be used in withMutations
.
A combination of updateIn
and mergeDeep
, returning a new Map, but
performing the deep merge at a point arrived at by following the keyPath.
In other words, these two lines are equivalent:
map.updateIn(['a', 'b', 'c'], abc => abc.mergeDeep(y))
map.mergeDeepIn(['a', 'b', 'c'], y)
Note: mergeDeepIn
can be used in withMutations
.
Like mergeDeep()
, but when two non-Collections conflict, it uses the
merger
function to determine the resulting value.
const { Map } = require('immutable')
const one = Map({ a: Map({ x: 10, y: 10 }), b: Map({ x: 20, y: 50 }) })
const two = Map({ a: Map({ x: 2 }), b: Map({ y: 5 }), c: Map({ z: 3 }) })
one.mergeDeepWith((oldVal, newVal) => oldVal / newVal, two)
// Map {
// "a": Map { "x": 5, "y": 10 },
// "b": Map { "x": 20, "y": 10 },
// "c": Map { "z": 3 }
// }
Note: mergeDeepWith
can be used in withMutations
.
A combination of updateIn
and merge
, returning a new Map, but
performing the merge at a point arrived at by following the keyPath.
In other words, these two lines are equivalent:
map.updateIn(['a', 'b', 'c'], abc => abc.merge(y))
map.mergeIn(['a', 'b', 'c'], y)
Note: mergeIn
can be used in withMutations
.
Like merge()
, mergeWith()
returns a new Map resulting from merging
the provided Collections (or JS objects) into this Map, but uses the
merger
function for dealing with conflicts.
const { Map } = require('immutable')
const one = Map({ a: 10, b: 20, c: 30 })
const two = Map({ b: 40, a: 50, d: 60 })
one.mergeWith((oldVal, newVal) => oldVal / newVal, two)
// { "a": 0.2, "b": 0.5, "c": 30, "d": 60 }
two.mergeWith((oldVal, newVal) => oldVal / newVal, one)
// { "b": 2, "a": 5, "d": 60, "c": 30 }
Note: mergeWith
can be used in withMutations
.
Creates a new Map from alternating keys and values
const { Map } = require('immutable')
Map.of(
'key', 'value',
'numerical value', 3,
0, 'numerical key'
)
// Map { 0: "numerical key", "key": "value", "numerical value": 3 }
Returns a new OrderedMap also containing the new key, value pair. If an equivalent key already exists in this OrderedMap, it will be replaced while maintaining the existing order.
const { OrderedMap } = require('immutable')
const originalMap = OrderedMap({a:1, b:1, c:1})
const updatedMap = originalMap.set('b', 2)
originalMap
// OrderedMap {a: 1, b: 1, c: 1}
updatedMap
// OrderedMap {a: 1, b: 2, c: 1}
Note: set
can be used in withMutations
.
Returns a new Map having set value
at this keyPath
. If any keys in
keyPath
do not exist, a new immutable Map will be created at that key.
const { Map } = require('immutable')
const originalMap = Map({
subObject: Map({
subKey: 'subvalue',
subSubObject: Map({
subSubKey: 'subSubValue'
})
})
})
const newMap = originalMap.setIn(['subObject', 'subKey'], 'ha ha!')
// Map {
// "subObject": Map {
// "subKey": "ha ha!",
// "subSubObject": Map { "subSubKey": "subSubValue" }
// }
// }
const newerMap = originalMap.setIn(
['subObject', 'subSubObject', 'subSubKey'],
'ha ha ha!'
)
// Map {
// "subObject": Map {
// "subKey": "subvalue",
// "subSubObject": Map { "subSubKey": "ha ha ha!" }
// }
// }
Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and setIn() can update those values as well, treating them immutably by creating new copies of those values with the changes applied.
const { Map } = require('immutable')
const originalMap = Map({
subObject: {
subKey: 'subvalue',
subSubObject: {
subSubKey: 'subSubValue'
}
}
})
originalMap.setIn(['subObject', 'subKey'], 'ha ha!')
// Map {
// "subObject": {
// subKey: "ha ha!",
// subSubObject: { subSubKey: "subSubValue" }
// }
// }
If any key in the path exists but cannot be updated (such as a primitive like number or a custom Object like Date), an error will be thrown.
Note: setIn
can be used in withMutations
.
Returns a new Map having updated the value at this key
with the return
value of calling updater
with the existing value.
Similar to: map.set(key, updater(map.get(key)))
.
const { Map } = require('immutable')
const aMap = Map({ key: 'value' })
const newMap = aMap.update('key', value => value + value)
// Map { "key": "valuevalue" }
This is most commonly used to call methods on collections within a
structure of data. For example, in order to .push()
onto a nested List
,
update
and push
can be used together:
const aMap = Map({ nestedList: List([ 1, 2, 3 ]) })
const newMap = aMap.update('nestedList', list => list.push(4))
// Map { "nestedList": List [ 1, 2, 3, 4 ] }
When a notSetValue
is provided, it is provided to the updater
function when the value at the key does not exist in the Map.
const aMap = Map({ key: 'value' })
const newMap = aMap.update('noKey', 'no value', value => value + value)
// Map { "key": "value", "noKey": "no valueno value" }
However, if the updater
function returns the same value it was called
with, then no change will occur. This is still true if notSetValue
is provided.
const aMap = Map({ apples: 10 })
const newMap = aMap.update('oranges', 0, val => val)
// Map { "apples": 10 }
assert.strictEqual(newMap, map);
For code using ES2015 or later, using notSetValue
is discourged in
favor of function parameter default values. This helps to avoid any
potential confusion with identify functions as described above.
The previous example behaves differently when written with default values:
const aMap = Map({ apples: 10 })
const newMap = aMap.update('oranges', (val = 0) => val)
// Map { "apples": 10, "oranges": 0 }
If no key is provided, then the updater
function return value is
returned as well.
const aMap = Map({ key: 'value' })
const result = aMap.update(aMap => aMap.get('key'))
// "value"
This can be very useful as a way to "chain" a normal function into a sequence of methods. RxJS calls this "let" and lodash calls it "thru".
For example, to sum the values in a Map
function sum(collection) {
return collection.reduce((sum, x) => sum + x, 0)
}
Map({ x: 1, y: 2, z: 3 })
.map(x => x + 1)
.filter(x => x % 2 === 0)
.update(sum)
// 6
Note: update(key)
can be used in withMutations
.
Returns a new Map having applied the updater
to the entry found at the
keyPath.
This is most commonly used to call methods on collections nested within a
structure of data. For example, in order to .push()
onto a nested List
,
updateIn
and push
can be used together:
const { Map, List } = require('immutable')
const map = Map({ inMap: Map({ inList: List([ 1, 2, 3 ]) }) })
const newMap = map.updateIn(['inMap', 'inList'], list => list.push(4))
// Map { "inMap": Map { "inList": List [ 1, 2, 3, 4 ] } }
If any keys in keyPath
do not exist, new Immutable Map
s will
be created at those keys. If the keyPath
does not already contain a
value, the updater
function will be called with notSetValue
, if
provided, otherwise undefined
.
const map = Map({ a: Map({ b: Map({ c: 10 }) }) })
const newMap = map.updateIn(['a', 'b', 'c'], val => val * 2)
// Map { "a": Map { "b": Map { "c": 20 } } }
If the updater
function returns the same value it was called with, then
no change will occur. This is still true if notSetValue
is provided.
const map = Map({ a: Map({ b: Map({ c: 10 }) }) })
const newMap = map.updateIn(['a', 'b', 'x'], 100, val => val)
// Map { "a": Map { "b": Map { "c": 10 } } }
assert.strictEqual(newMap, aMap)
For code using ES2015 or later, using notSetValue
is discourged in
favor of function parameter default values. This helps to avoid any
potential confusion with identify functions as described above.
The previous example behaves differently when written with default values:
const map = Map({ a: Map({ b: Map({ c: 10 }) }) })
const newMap = map.updateIn(['a', 'b', 'x'], (val = 100) => val)
// Map { "a": Map { "b": Map { "c": 10, "x": 100 } } }
Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and updateIn() can update those values as well, treating them immutably by creating new copies of those values with the changes applied.
const map = Map({ a: { b: { c: 10 } } })
const newMap = map.updateIn(['a', 'b', 'c'], val => val * 2)
// Map { "a": { b: { c: 20 } } }
If any key in the path exists but cannot be updated (such as a primitive like number or a custom Object like Date), an error will be thrown.
Note: updateIn
can be used in withMutations
.
Returns true if this is a mutable copy (see asMutable()
) and mutative
alterations have been applied.
Every time you call one of the above functions, a new immutable Map is created. If a pure function calls a number of these to produce a final return value, then a penalty on performance and memory has been paid by creating all of the intermediate immutable Maps.
If you need to apply a series of mutations to produce a new immutable
Map, withMutations()
creates a temporary mutable copy of the Map which
can apply mutations in a highly performant manner. In fact, this is
exactly how complex mutations like merge
are done.
As an example, this results in the creation of 2, not 4, new Maps:
const { Map } = require('immutable')
const map1 = Map()
const map2 = map1.withMutations(map => {
map.set('a', 1).set('b', 2).set('c', 3)
})
assert.equal(map1.size, 0)
assert.equal(map2.size, 3)
Note: Not all methods can be used on a mutable collection or within
withMutations
! Read the documentation for each method to see if it
is safe to use in withMutations
.
Generated using TypeDoc
Creates a new Immutable OrderedMap.
Created with the same key value pairs as the provided Collection.Keyed or JavaScript Object or expects a Collection of [K, V] tuple entries.
The iteration order of key-value pairs provided to this constructor will be preserved in the OrderedMap.
let newOrderedMap = OrderedMap({key: "value"}) let newOrderedMap = OrderedMap([["key", "value"]])
Note:
OrderedMap
is a factory function and not a class, and does not use thenew
keyword during construction.