0
votes

Comment itérer une carte () objet?

J'ai un objet de carte que j'ai besoin d'itérer, je peux donc obtenir la journée de la semaine et une heure sélectionnée. Le code ci-dessous ne fonctionne pas, car objet.keys (newfieldreservationprice) .foSeach code> tente de boucler un objet de carte () qui semble avoir aucun sens. Alors, y a-t-il une meilleure solution pour cela?

Voici le code ci-dessous: P>

handlePriceInput = (e, hour, day) => {
let value = e.target.value

const newFieldReservationPrice = this.state.newFieldReservationPrice
console.log('newFieldReservationPrice', newFieldReservationPrice) // A Map();
let map;

if (!newFieldReservationPrice instanceof Map) {
  console.log('!== Map')
  console.log('newFieldReservationPrice is a Map()? inside if ()', newFieldReservationPrice)
  if (newFieldReservationPrice[day] && newFieldReservationPrice[day][hour]) {
      newFieldReservationPrice[day][hour] = Number(value)
  } 
} else {
  map = new Map();
  console.log('map object', Object.keys(newFieldReservationPrice)) // logs map object []

  Object.keys(newFieldReservationPrice).forEach(key => {
    console.log('key', key)
      map.set(key, new Map(Object.entries(newFieldReservationPrice[key])));
  }); // This doesn't work
  console.log('Am I a Map()? map', map)

  const aux = map.get(day)
  console.log('aux day', aux) // A Map()
  aux.set(hour, Number(value)) // Comes as undefined || Cannot read property 'set' of undefined
  console.log('aux set', aux) // A Map()

  map.set(day, aux);
  console.log('what do I have?', map)

}
const isReservationPrice = !newFieldReservationPrice instanceof Map ? newFieldReservationPrice : map
console.log('isReservationPrice', isReservationPrice)

this.setState({
  newFieldReservationPrice: isReservationPrice
})
}


3 commentaires

développeur.mozilla.org/en-us/ DOCS / Web / JavaScript / Référence / ... Recherche sur Google un peu avant de poser une question


Dupliquer possible: Stackoverflow.com/questions/47135661/... . Pas exact dpeu, alors ne marquez pas comme Dupe


Dupliqué possible de en utilisant la carte () sur un itérateur


3 Réponses :


3
votes

Carte code> S Fournissez trois façons d'obtenir des itérateurs pour leur contenu:

  • TOUCHES CODE > - iTère les clés de la carte li>
  • valeurs code > - itère les valeurs li>
  • entrées code > - iTère la clé et les valeurs, vous donnant [touche, valeur] code> tableaux li> ul>

    comme Nina note , mappe code> s aussi fournir foreach code> , lequel Des boucles à travers leur contenu donnant le rappel la valeur, la clé et la carte en tant qu'arguments. P>

    Utilisez celui approprié pour votre cas d'utilisation. Par exemple, si vous essayez de remplacer objet.keys code>, utilisez les touches code>. De même, si vous souhaitez les entrées de la carte (je remarque que vous utilisez objet.entries code> sur un point), utilisez entrées code>. P>

    Notez que Quelques endroits de votre code, vous semblez essayer d'indexer sur la carte en utilisant [] code>. Cela ne fonctionne pas pour les cartes, vous devez utiliser obtenir code>. P>


    Notez également que vous rompez L'une des règles de réact en établissant un nouvel état basé sur l'état existant, mais pas l'utilisation du rappel version de SetState code>. Si vous devez utiliser l'état existant lors de la définition d'un nouvel état, vous DOIT FORT> Utilisez la version de rappel: P>

    this.setState(prevState => {
        // ...use `prevState` values (*not* `this.state`!) to create an object with
        // the updates, then return the object...
    });
    


7 commentaires

Merci pour l'explication. Vous voulez dire quelque chose comme map.set (clé, nouvelle carte (objet.entries (newfieldreservationprice.get.get (clé)))) ?


@RCOHEN - Qu'essayez-vous de faire avec Nouvelle carte (Object.entries (NewfielDreservationprice.get (clé))) ?


Comme vous l'avez dit, l'indexation [clé] dans la carte ne fonctionne pas. Donc, l'idée ici est quelque chose comme: - Lundi: - 08:00: 10 (Stockage de 10 en ce jour et heure) Obtenez la journée et l'heure, dans ce cas 08:00 pour enregistrer une nouvelle valeur. Avec newfieldreservationprice.foreach i itérer les heures


@RCOHEN - Oui, mais pourquoi créez-vous une carte à partir du résultat? Mais oui, je veux dire en utilisant newfieldreservationprice.get (clé) au lieu de NewfielDreservationPrice [clé] . C'était le repos de cela qui n'a pas de sens pour moi, car il suppose que les valeurs stockées dans newfieldreservationprice ne sont pas des mappes (car il utilise objet. Entrées ), mais vous définissez une carte comme valeur dans NewfielDreservationprice .


En effet, il s'agit de données provenant de DB comme objet et je dois le renvoyer en tant que carte. C'est pourquoi je fais ça. C'est une façon dont j'ai trouvé, peut-être pas le meilleur. @ T.j Crowder


@RCOHEN - Le problème est de vous retrouver avec NewfielDreservationPrice contenant un mélange d'objets et de cartes sans carte. Les convertissez-les tous vers des cartes sur la réception avant de les mettre dans NewfielDreservationprice ou ne les convertissez pas en cartes de cette opération.


Oui, c'est ce que j'ai vu juste maintenant. @ T.J. Foule



6
votes

Vous pouvez itérer une carte code> objet code> à l'aide de pour de code>: xxx pré>

qui est identique sur les entrées: p> xxx pré>

comme @nina Scholz a dit, vous pouvez utiliser foreach code> sur la carte code> prototype ( DOC MDN ): P>

myMap.forEach((value, key, map) => {
  console.log(key, value);
}


1 commentaires

Je ne sais pas pourquoi, avec objet.entries (Newfieldreservationprice) .foSeach ne fonctionne pas pour moi. La même chose pour objet.keys (NewfielDreservationprice) .foSeach



3
votes

Vous pouvez utiliser Carte #foDeach et itérer la carte directement.


0 commentaires