@@ -43,10 +43,10 @@ Then require it into any module.
43
43
44
44
<!-- runkit:activate -->
45
45
``` js
46
- const { Map } = require (' immutable' );
47
- const map1 = Map ({ a: 1 , b: 2 , c: 3 });
48
- const map2 = map1 .set (' b' , 50 );
49
- map1 .get (' b' ) + " vs. " + map2 .get (' b' ); // 2 vs. 50
46
+ const { Map } = require (' immutable' )
47
+ const map1 = Map ({ a: 1 , b: 2 , c: 3 })
48
+ const map2 = map1 .set (' b' , 50 )
49
+ map1 .get (' b' ) + " vs. " + map2 .get (' b' ) // 2 vs. 50
50
50
```
51
51
52
52
### Browser
@@ -68,7 +68,7 @@ Use a script tag to directly add `Immutable` to the global scope:
68
68
``` html
69
69
<script src =" immutable.min.js" ></script >
70
70
<script >
71
- var map1 = Immutable .Map ({ a : 1 , b: 2 , c: 3 });
71
+ var map1 = Immutable .Map ({a : 1 , b: 2 , c: 3 });
72
72
var map2 = map1 .set (' b' , 50 );
73
73
map1 .get (' b' ); // 2
74
74
map2 .get (' b' ); // 50
@@ -79,7 +79,7 @@ Or use an AMD-style loader (such as [RequireJS](http://requirejs.org/)):
79
79
80
80
``` js
81
81
require ([' ./immutable.min.js' ], function (Immutable ) {
82
- var map1 = Immutable .Map ({ a : 1 , b: 2 , c: 3 });
82
+ var map1 = Immutable .Map ({a : 1 , b: 2 , c: 3 });
83
83
var map2 = map1 .set (' b' , 50 );
84
84
map1 .get (' b' ); // 2
85
85
map2 .get (' b' ); // 50
@@ -108,7 +108,7 @@ lib. Include either `"target": "es2015"` or `"lib": "es2015"` in your
108
108
const { Map } = require (" immutable" );
109
109
const map1 = Map ({ a: 1 , b: 2 , c: 3 });
110
110
const map2 = map1 .set (' b' , 50 );
111
- map1 .get (' b' ) + " vs. " + map2 .get (' b' ); // 2 vs. 50
111
+ map1 .get (' b' ) + " vs. " + map2 .get (' b' ) // 2 vs. 50
112
112
```
113
113
114
114
#### Using TypeScript with Immutable.js v3 and earlier:
@@ -120,7 +120,7 @@ via relative path to the type definitions at the top of your file.
120
120
// /<reference path='./node_modules/immutable/dist/immutable.d.ts'/>
121
121
import Immutable from require(' immutable' );
122
122
var map1: Immutable .Map < string, number> ;
123
- map1 = Immutable .Map ({ a : 1 , b: 2 , c: 3 });
123
+ map1 = Immutable .Map ({a : 1 , b: 2 , c: 3 });
124
124
var map2 = map1 .set (' b' , 50 );
125
125
map1 .get (' b' ); // 2
126
126
map2 .get (' b' ); // 50
@@ -157,11 +157,11 @@ instead of the `===` operator which determines object *reference identity*.
157
157
158
158
<!-- runkit:activate -->
159
159
``` js
160
- const { Map } = require (' immutable' );
161
- const map1 = Map ({ a: 1 , b: 2 , c: 3 });
162
- const map2 = Map ({ a: 1 , b: 2 , c: 3 });
163
- map1 .equals (map2); // true
164
- map1 === map2; // false
160
+ const { Map } = require (' immutable' )
161
+ const map1 = Map ({ a: 1 , b: 2 , c: 3 })
162
+ const map2 = Map ({ a: 1 , b: 2 , c: 3 })
163
+ map1 .equals (map2) // true
164
+ map1 === map2 // false
165
165
```
166
166
167
167
Note: As a performance optimization Immutable.js attempts to return the existing
@@ -174,10 +174,10 @@ potentially be more costly. The `===` equality check is also used internally by
174
174
175
175
<!-- runkit:activate -->
176
176
``` js
177
- const { Map } = require (' immutable' );
178
- const map1 = Map ({ a: 1 , b: 2 , c: 3 });
179
- const map2 = map1 .set (' b' , 2 ); // Set to same value
180
- map1 === map2; // true
177
+ const { Map } = require (' immutable' )
178
+ const map1 = Map ({ a: 1 , b: 2 , c: 3 })
179
+ const map2 = map1 .set (' b' , 2 ) // Set to same value
180
+ map1 === map2 // true
181
181
```
182
182
183
183
If an object is immutable, it can be "copied" simply by making another reference
@@ -187,8 +187,8 @@ execution speed for programs which rely on copies (such as an undo-stack).
187
187
188
188
<!-- runkit:activate -->
189
189
``` js
190
- const { Map } = require (' immutable' );
191
- const map = Map ({ a: 1 , b: 2 , c: 3 });
190
+ const { Map } = require (' immutable' )
191
+ const map = Map ({ a: 1 , b: 2 , c: 3 })
192
192
const mapCopy = map; // Look, "copies" are free!
193
193
```
194
194
@@ -216,7 +216,7 @@ instead return new immutable collections.
216
216
217
217
<!-- runkit:activate -->
218
218
``` js
219
- const { List } = require (' immutable' );
219
+ const { List } = require (' immutable' )
220
220
const list1 = List ([ 1 , 2 ]);
221
221
const list2 = list1 .push (3 , 4 , 5 );
222
222
const list3 = list2 .unshift (0 );
@@ -235,7 +235,7 @@ and `map()`.
235
235
236
236
<!-- runkit:activate -->
237
237
``` js
238
- const { Map } = require (' immutable' );
238
+ const { Map } = require (' immutable' )
239
239
const alpha = Map ({ a: 1 , b: 2 , c: 3 , d: 4 });
240
240
alpha .map ((v , k ) => k .toUpperCase ()).join ();
241
241
// 'A,B,C,D'
@@ -249,16 +249,16 @@ accepts plain JavaScript Arrays and Objects anywhere a method expects a
249
249
250
250
<!-- runkit:activate -->
251
251
``` js
252
- const { Map , List } = require (' immutable' );
253
- const map1 = Map ({ a: 1 , b: 2 , c: 3 , d: 4 });
254
- const map2 = Map ({ c: 10 , a: 20 , t: 30 });
255
- const obj = { d: 100 , o: 200 , g: 300 };
252
+ const { Map , List } = require (' immutable' )
253
+ const map1 = Map ({ a: 1 , b: 2 , c: 3 , d: 4 })
254
+ const map2 = Map ({ c: 10 , a: 20 , t: 30 })
255
+ const obj = { d: 100 , o: 200 , g: 300 }
256
256
const map3 = map1 .merge (map2, obj);
257
257
// Map { a: 20, b: 2, c: 10, d: 100, t: 30, o: 200, g: 300 }
258
- const list1 = List ([ 1 , 2 , 3 ]);
259
- const list2 = List ([ 4 , 5 , 6 ]);
260
- const array = [ 7 , 8 , 9 ];
261
- const list3 = list1 .concat (list2, array);
258
+ const list1 = List ([ 1 , 2 , 3 ])
259
+ const list2 = List ([ 4 , 5 , 6 ])
260
+ const array = [ 7 , 8 , 9 ]
261
+ const list3 = list1 .concat (list2, array)
262
262
// List [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
263
263
```
264
264
@@ -270,8 +270,8 @@ results, these operations can be extremely efficient.
270
270
271
271
<!-- runkit:activate -->
272
272
``` js
273
- const { Seq } = require (' immutable' );
274
- const myObject = { a: 1 , b: 2 , c: 3 };
273
+ const { Seq } = require (' immutable' )
274
+ const myObject = { a: 1 , b: 2 , c: 3 }
275
275
Seq (myObject).map (x => x * x).toObject ();
276
276
// { a: 1, b: 4, c: 9 }
277
277
```
@@ -282,14 +282,14 @@ shorthand, while Immutable Maps accept keys of any type.
282
282
283
283
<!-- runkit:activate -->
284
284
``` js
285
- const { fromJS } = require (' immutable' );
285
+ const { fromJS } = require (' immutable' )
286
286
287
- const obj = { 1 : " one" };
288
- console .log (Object .keys (obj)); // [ "1" ]
289
- console .log (obj[" 1" ], obj[1 ]); // "one", "one"
287
+ const obj = { 1 : " one" }
288
+ console .log (Object .keys (obj)) // [ "1" ]
289
+ console .log (obj[" 1" ], obj[1 ]) // "one", "one"
290
290
291
- const map = fromJS (obj);
292
- console .log (map .get (" 1" ), map .get (1 )); // "one", undefined
291
+ const map = fromJS (obj)
292
+ console .log (map .get (" 1" ), map .get (1 )) // "one", undefined
293
293
```
294
294
295
295
Property access for JavaScript Objects first converts the key to a string, but
@@ -307,12 +307,12 @@ nested objects.
307
307
308
308
<!-- runkit:activate -->
309
309
``` js
310
- const { Map , List } = require (' immutable' );
311
- const deep = Map ({ a: 1 , b: 2 , c: List ([ 3 , 4 , 5 ]) });
312
- console .log (deep .toObject ()); // { a: 1, b: 2, c: List [ 3, 4, 5 ] }
313
- console .log (deep .toArray ()); // [ 1, 2, List [ 3, 4, 5 ] ]
314
- console .log (deep .toJS ()); // { a: 1, b: 2, c: [ 3, 4, 5 ] }
315
- JSON .stringify (deep); // '{"a":1,"b":2,"c":[3,4,5]}'
310
+ const { Map , List } = require (' immutable' )
311
+ const deep = Map ({ a: 1 , b: 2 , c: List ([ 3 , 4 , 5 ]) })
312
+ console .log (deep .toObject ()) // { a: 1, b: 2, c: List [ 3, 4, 5 ] }
313
+ console .log (deep .toArray ()) // [ 1, 2, List [ 3, 4, 5 ] ]
314
+ console .log (deep .toJS ()) // { a: 1, b: 2, c: [ 3, 4, 5 ] }
315
+ JSON .stringify (deep) // '{"a":1,"b":2,"c":[3,4,5]}'
316
316
```
317
317
318
318
### Embraces ES2015
@@ -338,9 +338,9 @@ used anywhere an Iterable is expected, such as when spreading into an Array.
338
338
339
339
<!-- runkit:activate -->
340
340
``` js
341
- const { List } = require (' immutable' );
342
- const aList = List ([ 1 , 2 , 3 ]);
343
- const anArray = [ 0 , ... aList, 4 , 5 ]; // [ 0, 1, 2, 3, 4, 5 ]
341
+ const { List } = require (' immutable' )
342
+ const aList = List ([ 1 , 2 , 3 ])
343
+ const anArray = [ 0 , ... aList, 4 , 5 ] // [ 0, 1, 2, 3, 4, 5 ]
344
344
```
345
345
346
346
Note: A Collection is always iterated in the same order, however that order may
@@ -360,8 +360,8 @@ trees of data, similar to JSON.
360
360
361
361
<!-- runkit:activate -->
362
362
``` js
363
- const { fromJS } = require (' immutable' );
364
- const nested = fromJS ({ a: { b: { c: [ 3 , 4 , 5 ] } } });
363
+ const { fromJS } = require (' immutable' )
364
+ const nested = fromJS ({ a: { b: { c: [ 3 , 4 , 5 ] } } })
365
365
// Map { a: Map { b: Map { c: List [ 3, 4, 5 ] } } }
366
366
```
367
367
@@ -371,19 +371,19 @@ most useful are `mergeDeep`, `getIn`, `setIn`, and `updateIn`, found on `List`,
371
371
372
372
<!-- runkit:activate -->
373
373
``` js
374
- const { fromJS } = require (' immutable' );
375
- const nested = fromJS ({ a: { b: { c: [ 3 , 4 , 5 ] } } });
374
+ const { fromJS } = require (' immutable' )
375
+ const nested = fromJS ({ a: { b: { c: [ 3 , 4 , 5 ] } } })
376
376
377
- const nested2 = nested .mergeDeep ({ a: { b: { d: 6 } } });
377
+ const nested2 = nested .mergeDeep ({ a: { b: { d: 6 } } })
378
378
// Map { a: Map { b: Map { c: List [ 3, 4, 5 ], d: 6 } } }
379
379
380
- console .log (nested2 .getIn ([ ' a' , ' b' , ' d' ])); // 6
380
+ console .log (nested2 .getIn ([ ' a' , ' b' , ' d' ])) // 6
381
381
382
- const nested3 = nested2 .updateIn ([ ' a' , ' b' , ' d' ], value => value + 1 );
382
+ const nested3 = nested2 .updateIn ([ ' a' , ' b' , ' d' ], value => value + 1 )
383
383
console .log (nested3);
384
384
// Map { a: Map { b: Map { c: List [ 3, 4, 5 ], d: 7 } } }
385
385
386
- const nested4 = nested3 .updateIn ([ ' a' , ' b' , ' c' ], list => list .push (6 ));
386
+ const nested4 = nested3 .updateIn ([ ' a' , ' b' , ' c' ], list => list .push (6 ))
387
387
// Map { a: Map { b: Map { c: List [ 3, 4, 5, 6 ], d: 7 } } }
388
388
```
389
389
@@ -403,28 +403,28 @@ Consider the example below where two identical `Map` instances are not
403
403
<!-- runkit:activate -->
404
404
``` js
405
405
// First consider:
406
- const obj1 = { a: 1 , b: 2 , c: 3 };
407
- const obj2 = { a: 1 , b: 2 , c: 3 };
408
- obj1 !== obj2; // two different instances are always not equal with ===
409
-
410
- const { Map , is } = require (' immutable' );
411
- const map1 = Map ({ a: 1 , b: 2 , c: 3 });
412
- const map2 = Map ({ a: 1 , b: 2 , c: 3 });
413
- map1 !== map2; // two different instances are not reference-equal
414
- map1 .equals (map2); // but are value-equal if they have the same values
415
- is (map1, map2); // alternatively can use the is() function
406
+ const obj1 = { a: 1 , b: 2 , c: 3 }
407
+ const obj2 = { a: 1 , b: 2 , c: 3 }
408
+ obj1 !== obj2 // two different instances are always not equal with ===
409
+
410
+ const { Map , is } = require (' immutable' )
411
+ const map1 = Map ({ a: 1 , b: 2 , c: 3 })
412
+ const map2 = Map ({ a: 1 , b: 2 , c: 3 })
413
+ map1 !== map2 // two different instances are not reference-equal
414
+ map1 .equals (map2) // but are value-equal if they have the same values
415
+ is (map1, map2) // alternatively can use the is() function
416
416
```
417
417
418
418
Value equality allows Immutable.js collections to be used as keys in Maps or
419
419
values in Sets, and retrieved with different but equivalent collections:
420
420
421
421
<!-- runkit:activate -->
422
422
``` js
423
- const { Map , Set } = require (' immutable' );
424
- const map1 = Map ({ a: 1 , b: 2 , c: 3 });
425
- const map2 = Map ({ a: 1 , b: 2 , c: 3 });
426
- const set = Set ().add (map1);
427
- set .has (map2); // true because these are value-equal
423
+ const { Map , Set } = require (' immutable' )
424
+ const map1 = Map ({ a: 1 , b: 2 , c: 3 })
425
+ const map2 = Map ({ a: 1 , b: 2 , c: 3 })
426
+ const set = Set ().add (map1)
427
+ set .has (map2) // true because these are value-equal
428
428
```
429
429
430
430
Note: ` is() ` uses the same measure of equality as [ Object.is] [ ] for scalar
@@ -459,10 +459,10 @@ to quickly determine if no change occurred.
459
459
460
460
<!-- runkit:activate -->
461
461
``` js
462
- const { Map } = require (' immutable' );
463
- const originalMap = Map ({ a: 1 , b: 2 , c: 3 });
464
- const updatedMap = originalMap .set (' b' , 2 );
465
- updatedMap === originalMap; // No-op .set() returned the original reference.
462
+ const { Map } = require (' immutable' )
463
+ const originalMap = Map ({ a: 1 , b: 2 , c: 3 })
464
+ const updatedMap = originalMap .set (' b' , 2 )
465
+ updatedMap === originalMap // No-op .set() returned the original reference.
466
466
```
467
467
468
468
However updates which do result in a change will return a new reference. Each
@@ -471,16 +471,16 @@ the same reference:
471
471
472
472
<!-- runkit:activate -->
473
473
``` js
474
- const { Map } = require (' immutable' );
475
- const originalMap = Map ({ a: 1 , b: 2 , c: 3 });
476
- const updatedMap = originalMap .set (' b' , 1000 );
474
+ const { Map } = require (' immutable' )
475
+ const originalMap = Map ({ a: 1 , b: 2 , c: 3 })
476
+ const updatedMap = originalMap .set (' b' , 1000 )
477
477
// New instance, leaving the original immutable.
478
- updatedMap !== originalMap;
479
- const anotherUpdatedMap = originalMap .set (' b' , 1000 );
478
+ updatedMap !== originalMap
479
+ const anotherUpdatedMap = originalMap .set (' b' , 1000 )
480
480
// Despite both the results of the same operation, each created a new reference.
481
- anotherUpdatedMap !== updatedMap;
481
+ anotherUpdatedMap !== updatedMap
482
482
// However the two are value equal.
483
- anotherUpdatedMap .equals (updatedMap);
483
+ anotherUpdatedMap .equals (updatedMap)
484
484
```
485
485
486
486
Batching Mutations
@@ -505,7 +505,7 @@ immutable Lists.
505
505
506
506
<!-- runkit:activate -->
507
507
``` js
508
- const { List } = require (' immutable' );
508
+ const { List } = require (' immutable' )
509
509
const list1 = List ([ 1 , 2 , 3 ]);
510
510
const list2 = list1 .withMutations (function (list ) {
511
511
list .push (4 ).push (5 ).push (6 );
@@ -545,10 +545,10 @@ For example, the following performs no work, because the resulting
545
545
` Seq ` 's values are never iterated:
546
546
547
547
``` js
548
- const { Seq } = require (' immutable' );
548
+ const { Seq } = require (' immutable' )
549
549
const oddSquares = Seq ([ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ])
550
550
.filter (x => x % 2 !== 0 )
551
- .map (x => x * x);
551
+ .map (x => x * x)
552
552
```
553
553
554
554
Once the ` Seq ` is used, it performs only the work
10B8B
necessary. In this
@@ -563,9 +563,9 @@ Any collection can be converted to a lazy Seq with `Seq()`.
563
563
564
564
<!-- runkit:activate -->
565
565
``` js
566
- const { Map , Seq } = require (' immutable' );
567
- const map = Map ({ a: 1 , b: 2 , c: 3 });
568
- const lazySeq = Seq (map);
566
+ const { Map , Seq } = require (' immutable' )
567
+ const map = Map ({ a: 1 , b: 2 , c: 3 })
568
+ const lazySeq = Seq (map)
569
569
```
570
570
571
571
` Seq ` allows for the efficient chaining of operations, allowing for the
@@ -575,7 +575,7 @@ expression of logic that can otherwise be very tedious:
575
575
lazySeq
576
576
.flip ()
577
577
.map (key => key .toUpperCase ())
578
- .flip ();
578
+ .flip ()
579
579
// Seq { A: 1, B: 1, C: 1 }
580
580
```
581
581
@@ -584,13 +584,13 @@ limited, for example `Range` is a special kind of Lazy sequence.
584
584
585
585
<!-- runkit:activate -->
586
586
``` js
587
- const { Range } = require (' immutable' );
587
+ const { Range } = require (' immutable' )
588
588
Range (1 , Infinity )
589
589
.skip (1000 )
590
590
.map (n => - n)
591
591
.filter (n => n % 2 === 0 )
592
592
.take (2 )
593
- .reduce ((r , n ) => r * n, 1 );
593
+ .reduce ((r , n ) => r * n, 1 )
594
594
// 1006008
595
595
```
596
596
0 commit comments