2017-03-17 2 views
0

Je suis nouveau à javascript et je veux accomplir une tâche en utilisant js immuable. J'ai une carte comme ceci:Boucle à travers une carte imbriquée en js immutable

const clients = Map({ 
     "c1": { 
      "id": "c1", 
      "isLegalEntity": false, 
      "wantsEstatements": true, 
      "portfolios": { 
       "a": { 
        "id": "a", 
        "type": "Cash" 
       }, 
       "b": { 
        "id": "b", 
        "type": "Margin" 
       } 
      } 
     }, 
     "c2": { 
      "id": "c2", 
      "isLegalEntity": false, 
      "wantsEstatements": true, 
      "portfolios": { 
       "e": { 
        "id": "e", 
        "type": "Cash" 
       }, 
       "f": { 
        "id": "f", 
        "type": "Margin" 
       } 
      } 
     } 
    }) 

Je veux créer trois tables. La première table contiendra les valeurs "c1" et "c2" donc dans la documentation que j'ai lu j'utilise la propriété clients.keys(). L'autre table doit contenir tous les portefeuilles id comme ceci: ["e", "f"] et la dernière table doit contenir tous les types de portefeuilles comme ceci: ["cash", "margin"] mais je ne sais pas comment faire cela à partir de la documentation. Savez-vous comment?

Répondre

1

Je ne suis pas sûr de ce que vous voulez faire une fois que vous avez les tableaux, donc je les ai simplement affichés dans une balise HTML dans cet exemple. Cependant, cela devrait vous montrer comment créer chacun des tableaux que vous recherchez. La première étape consiste à obtenir le tableau des ID client en utilisant Array.from (clients.keys()); appel. Après cela, vous utilisez les ID client dans un appel clients.getIn(), qui renvoie un objet javascript standard pour chaque client. Après cela, vous pouvez utiliser des méthodes d'accès aux objets javascript standard pour créer les tableaux que vous voulez depuis l'objet client.

var clients = Immutable.Map({ 
 
    "c1": { 
 
    "id": "c1", 
 
    "isLegalEntity": false, 
 
    "wantsEstatements": true, 
 
    "portfolios": { 
 
     "a": { 
 
     "id": "a", 
 
     "type": "Cash" 
 
     }, 
 
     "b": { 
 
     "id": "b", 
 
     "type": "Margin" 
 
     } 
 
    } 
 
    }, 
 
    "c2": { 
 
    "id": "c2", 
 
    "isLegalEntity": false, 
 
    "wantsEstatements": true, 
 
    "portfolios": { 
 
     "e": { 
 
     "id": "e", 
 
     "type": "Cash" 
 
     }, 
 
     "f": { 
 
     "id": "f", 
 
     "type": "Margin" 
 
     } 
 
    } 
 
    } 
 
}); 
 

 
function logArray(arr) { 
 
    var str = "["; 
 
    for (var i = 0; i < arr.length; i++) { 
 
    str += arr[i]; 
 
    if (i < arr.length - 1) str += ","; 
 
    } 
 
    str += "]" 
 
    document.getElementById("info").innerHTML += str + "<br>"; 
 
} 
 

 
var client_id_array = Array.from(clients.keys()); 
 
logArray(client_id_array); 
 
for (var i = 0; i < client_id_array.length; i++) { 
 
    var obj = clients.getIn([client_id_array[i]]); 
 
    var portfolio_array = Object.keys(obj.portfolios); 
 
    logArray(portfolio_array); 
 
    var types = []; 
 
    for (j = 0; j < portfolio_array.length; j++) { 
 
    types[j] = obj.portfolios[portfolio_array[j]].type; 
 
    } 
 
    logArray(types); 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.7.5/immutable.js"></script> 
 

 
<div id="info"></div>

+0

génial! Merci! – user7334203

+0

J'ai un petit problème ici ... j'essaie de consoler.log le tableau portfolio mais var portfolio_array = Object.keys (obj.portfolios); me montre l'erreur que les portefeuilles est indéfini – user7334203

+0

J'ai trouvé la bonne réponse. J'utilise const obj = clients.getIn ([clientsIdArray [0], 'portfolios']); puis const portArray = obj.keySeq(). toArray() – user7334203