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 Voici le code ci-dessous: P> 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? 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 Réponses :
comme Nina note , Utilisez celui approprié pour votre cas d'utilisation. Par exemple, si vous essayez de remplacer Notez que Quelques endroits de votre code, vous semblez essayer d'indexer sur la carte en utilisant 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 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> 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> 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> [] code>. Cela ne fonctionne pas pour les cartes, vous devez utiliser obtenir code>. P>
SetState code>. Si vous devez utiliser l'état existant lors de la définition d'un nouvel état, vous this.setState(prevState => {
// ...use `prevState` values (*not* `this.state`!) to create an object with
// the updates, then return the object...
});
Merci pour l'explication. Vous voulez dire quelque chose comme map.set (clé, nouvelle carte (objet.entries (newfieldreservationprice.get.get (clé)))) code>?
@RCOHEN - Qu'essayez-vous de faire avec Nouvelle carte (Object.entries (NewfielDreservationprice.get (clé))) CODE>?
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 code> 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é) code> au lieu de NewfielDreservationPrice [clé] code>. C'était le repos i> de cela qui n'a pas de sens pour moi, car il suppose que les valeurs stockées dans newfieldreservationprice code> ne sont pas des mappes (car il utilise objet. Entrées CODE>), mais vous définissez une carte comme valeur dans NewfielDreservationprice code>.
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 Code> 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 code> ou ne les convertissez pas en cartes de cette opération.
Oui, c'est ce que j'ai vu juste maintenant. @ T.J. Foule
Vous pouvez itérer une carte code> objet code> à l'aide de qui est identique sur les entrées: p> comme @nina Scholz a dit, vous pouvez utiliser pour de code>: foreach code> sur la carte code> prototype ( DOC MDN ): P> myMap.forEach((value, key, map) => {
console.log(key, value);
}
Je ne sais pas pourquoi, avec objet.entries (Newfieldreservationprice) .foSeach code> ne fonctionne pas pour moi. La même chose pour objet.keys (NewfielDreservationprice) .foSeach code>
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