J'ai un tableau avec des données et je souhaite comparer les données avec event.target.value Quand il s'agit de la même valeur, je veux qu'il obtienne plus d'informations sur les données qui se trouvent dans cette position du tableau.
il dit que le caractère n'est pas défini, et je suppose que c'est un problème de portée mais je ne sais pas comment le résoudre.
Le console.log (character.mass, character.height) est pour à des fins de test.
handleClick(event){
event.preventDefault();
const CharacterDataArray = this.props.CharacterData.results
console.log(CharacterDataArray)
if(CharacterDataArray.map(character => character.name === event.target.value)) {
console.log(character.mass, character.height)
}
this.setState({
CharacterName: event.target.value
})
}
7 Réponses :
vous devez utiliser la fonction de flèche pour résoudre le problème de portée comme
constructor () {
this.handleClick = this.handleClick.bind(this);
}
ou vous pouvez lier l'événement click dans le constructeur comme
handleClick =(event)=>{
// your code goes here
}
au lieu d'utiliser .map , vous pouvez utiliser .some pour référence, vous pouvez aller sur ce lien:
https://developer.mozilla.org/ fr-FR / docs / Web / JavaScript / Reference / Global_Objects / Array / certains
et si votre this.props ne peut pas être joignable, vous devez être remplacé par fonction de flèche par exemple: handleClick = () => {...}
Le problème est que le caractère n'est défini que dans la fonction de rappel de la map .
Essayez plutôt ceci:
// Look through all characters and return it if the name matches
const matchingChar = CharacterDataArray.find(character => character.name === event.target.value)
// Log if a match has been found
if (matchingChar) {
console.log(matchingChar.mass, matchingChar.height);
}
Cela marche! @sandrooco, la fonction flèche est facultative, fonctionne dans les deux sens. Merci!
Utilisez la méthode find pour trouver un caractère où le character.name est égal à event.target.value .
const hasValue = CharacterDataArray.find(character => character.name === event.target.value)
if(hasValue) {
// write your logic
}
Vous devez d'abord utiliser la fonction de flèche car à l'intérieur de la fonction de flèche, vous pouvez accéder à "ceci" et la deuxième chose dont vous avez besoin pour vérifier également que le tableau n'est pas vide
handleClick = (event) => {
event.preventDefault();
if(this.props.CharacterData.results && this.props.CharacterData.results.length > 0) {
if(this.props.CharacterData.results.map(character => character.name === event.target.value)) {
console.log(character.mass, character.height)
}
this.setState({
CharacterName: event.target.value
})
}
}
async handleClick(event){
await event.preventDefault();
let CharacterDataArray = this.props.CharacterData.results;
console.log(CharacterDataArray);
let result=CharacterDataArray.filter(character=>character.name === event.target.value);
console.log(result.mass, result.height);
}
preventDefault () ne renvoie aucune promesse? L'autre code lancera une erreur ... ( result est un tableau, pas un objet).
Essayez avec ceci: -
CharacterDataArray.map((character) => {
if (character.name === event.target.value))
{
console.log(character.mass, character.height)
}
})
Pouvez-vous également ajouter le résultat de console.log (CharacterDataArray)
Pourquoi utilisez-vous le résultat de
mapcomme condition dans votre instruction if? Recherchez-vous un tableau vide?Le
caractèreest utilisé uniquement à l'intérieur demap (). Vous essayez de console.log dans l'instructionif. C'est pourquoi il n'y est pas défini.@byxor Je le fais parce que je veux retourner le this.state, mais je ne sais pas si c'est la bonne façon? Souhaitez-vous suggérer un forEach ()?
J'ai utilisé la solution de @sandrooco dans le post ci-dessous et il s'avère que la fonction de flèche est facultative. Merci pour l'aide!
ajoutez simplement .langht au et de if