Advertisement
Guest User

Javascript (ES6) Immutable Data Example

a guest
May 27th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // cardInfo has all the information of each card that never has to change, e.g. card name, stats etc.
  2. const cardInfo = {
  3.   1: {
  4.     name: "Card 1",
  5.     info: "This is card 1"
  6.   },
  7.   2: {
  8.     name: "Card 2",
  9.     info: "This is card 2"
  10.   },
  11.   3: {
  12.     name: "Card 3",
  13.     info: "This is card 3"
  14.   },
  15.   4: {
  16.     name: "Card 4",
  17.     info: "This is card 4"
  18.   }
  19. };
  20.  
  21. const initDecklist = new Map();
  22. initDecklist.set(1,{quantity: 1});
  23. initDecklist.set(3,{quantity: 2});
  24.  
  25. let state = {
  26.   decklist: initDecklist
  27. };
  28.  
  29. const exampleCardToAdd = {
  30.   id: 1
  31. };
  32.  
  33. const exampleCardToAddAgain = {
  34.   id: 4
  35. };
  36.  
  37. const setState = (newState = {}) => {
  38.   try {
  39.     state = Object.assign(state, newState)    
  40.   } catch (e) {
  41.     console.error(`Unable to update state with ${newState}`);
  42.   }  
  43. }
  44.  
  45. const addCard = (cardId, oldDecklist, quantity = 1) => {
  46.   const newDecklist = new Map(oldDecklist);
  47.   if (newDecklist.has(cardId)) {
  48.     const oldObject = newDecklist.get(cardId)
  49.     const newObject = Object.assign(
  50.       {},
  51.       oldObject,
  52.       {
  53.         quantity: oldObject.quantity + quantity
  54.       }
  55.     );
  56.     newDecklist.set(cardId, newObject);
  57.   } else {
  58.     newDecklist.set(cardId, { quantity });
  59.   }
  60.   return newDecklist;
  61. }
  62.  
  63. const addCardToDeck = cardToAdd => {
  64.   const { decklist } = state;
  65.   const newDecklist = addCard(cardToAdd.id, decklist);
  66.   setState({ decklist: newDecklist});
  67. }
  68.  
  69. const addCardToDeckTwice = cardToAdd => {
  70.   const { decklist } = state;
  71.   const newDecklist = addCard(cardToAdd.id, decklist, 2);
  72.   setState({ decklist: newDecklist});
  73. }
  74.  
  75. const printCards = () => {
  76.   const { decklist } = state;
  77.   for (let [id, v] of decklist.entries()) {    
  78.     const details = cardInfo[id];
  79.     console.log(`+++\nCard: ${details.name}\nQuantity: ${v.quantity}\nInfo: ${details.info}`);
  80.   }  
  81. }
  82.  
  83. console.log(state);
  84. // { decklist: Map { 1 => { quantity: 1 }, 3 => { quantity: 2 } } }
  85.  
  86. addCardToDeck(exampleCardToAdd);
  87.  
  88. console.log(state);
  89. // { decklist: Map { 1 => { quantity: 2 }, 3 => { quantity: 2 } } }
  90.  
  91. addCardToDeckTwice(exampleCardToAddAgain);
  92.  
  93. console.log(state);
  94. /*
  95. { decklist:
  96.    Map {
  97.      1 => { quantity: 2 },
  98.      3 => { quantity: 2 },
  99.      4 => { quantity: 2 } } }
  100. */
  101.  
  102. printCards();
  103. /*
  104. +++
  105. Card: Card 1
  106. Quantity: 2
  107. Info: This is card 1
  108. +++
  109. Card: Card 3
  110. Quantity: 2
  111. Info: This is card 3
  112. +++
  113. Card: Card 4
  114. Quantity: 2
  115. Info: This is card 4
  116. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement