2017-10-21 43 views
1

Je possède ce code dans ma fonctionComment extraire une valeur de propriété d'un objet appelé avec .find()?

let packName: string = respPack.find(a => {a.id == 'name_input'}).answer.replace(/ /,'_'); 

Ce que je suis en train de faire est de trouver l'objet en faisant correspondre l'identifiant et extraire la valeur de sa propriété de réponse. En ce moment je reçois une erreur me disant

ne peut pas lire la réponse de propriété de indéfini.

Est-ce que j'essaie de le faire de la bonne façon? Voici le reste de ma fonction pour que vous puissiez voir ce qui se passe.

saveResponses(){ 
    const respPack = this.ResponseList; 
    const sendTarget: FirebaseObjectObservable<any> = this.afdb.object('/submissions'); 

    let dataLoad:{ [prop : string]: Array<any> } = {}; 
    let packName: string = respPack.find(a => {a.id == 'name_input'}).answer.replace(/ /,'_'); 

    respPack.forEach(a => { 
     if(a.answer){ 
      let data = { question: a.question, answer: a.answer, id: a.id }; 
      dataLoad[packName].push(data); 
     } 
     else if(a.responses){ 
      let dataChunk = { question: a.question, id: a.id, responses: Array<any> }; 

      a.responses.forEach(resp => { 
       let respChunk = { response: resp.response, value: resp.value, id: resp.id }; 
       dataChunk.responses.push(respChunk); 
      }); 
      dataLoad[packName].push(dataChunk); 
     } 
    }); 

    sendTarget.set(dataLoad); 
} 
+0

Pouvez-vous utiliser '' === au lieu de '' ==? – edkeveked

+0

Que devrait-il se passer si 'packName' est' undefined'? – guest271314

Répondre

2

Si vous utilisez une fonction de flèche avec {} vous devez inclure return.

Par exemple:

a => {return a.id == 'name_input'} 

En outre, find retournera undefined si aucun élément ne trouve, vous devrez traiter ces cas.

Voici un exemple complet:

let packName: string = ""; 
let foundElement = respPack.find(a => { 
           return a.id == 'name_input'; 
          }); 
if(foundElement){ 
    packName = foundElement.answer.replace(/ /,'_'); 
} 

Ou si vous voulez garder une ligne.

let packName: string = ((respPack.find(a => a.id == 'name_input') || {}).answer || "").replace(/ /,'_'); 
+0

Merci. J'ai découvert que j'avais juste besoin d'ajouter 'return' et tout fonctionne. – Optiq

1

yourArray.find (élément) sera retrun l'élément suivant est un exemple

En savoir plus sur find()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

var inventory = [ 
    {name: 'apples', quantity: 2}, 
    {name: 'bananas', quantity: 0}, 
    {name: 'cherries', quantity: 5} 
]; 

function findCherries(fruit) { 
    return fruit.name === 'cherries'; 
} 

console.log(inventory.find(findCherries)); 
// { name: 'cherries', quantity: 5 } 

Vous avez la question dans votre découverte méthode appelant

a => {return a.id == 'name_input'} 

En savoir plus sur la fonction flèche

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions