2016-11-22 6 views
5

है इस उदाहरण को ध्यान में रखते:अच्छा तरीका अगर जावास्क्रिप्ट में एक वस्तु श्रृंखला मान्य

if(this.plantService.plants[id]) 
    { 
     if(this.plantService.plants[id].Name) 
     { 
      if(this.plantService.plants[id].Name[0]) 
       return this.plantService.plants[id].Name[0].value; 
      else 
       return ''; 
     } 
     else 
      return '';   
    }  
    return ''; 

मैं अगर यह मैं यहाँ क्या कर रहा हूँ को आसान बनाने के लिए संभव है सोच रहा हूँ।

मेरा लक्ष्य वैधता के लिए ऑब्जेक्ट-चेन this.plantService.plants[id].Name[0] का परीक्षण करना है।

हालांकि, अगर मैं सिर्फ if(this.plantService.plants[id].Name[0]) {...} अपवादों का परीक्षण करता हूं तो परीक्षण किया जाता है।

कोई प्रस्ताव? :)

+2

आप '&&' op का उपयोग कर सकते हैं यदि आपके जैसा इरेटर है: 'if (this.plantService.plants [id] && this.plantService.plants [id] .ame && this.plantService.plants [id] .ame [0]) {this.plantService को वापस करें। पौधे [आईडी] .नाम [0] .value} अन्य {वापसी ''} ' –

+0

कृपया हमें अपवाद फेंक दें। आप केवल इतना कहते हैं, लेकिन वह क्या है? –

+1

@SuperCoolHandsomeGelBoy यह 'TypeError' होगा, क्योंकि आप' अपरिभाषित 'पर किसी संपत्ति तक पहुंचने का प्रयास करेंगे। –

उत्तर

4

आप वस्तु के साथ सरणी को कम कर सकता मूल्य की जाँच के बाद और टाइप करें।

function getIn(object, keys, def) { 
 
    return keys.reduce(function (o, k) { 
 
     return o && typeof o === 'object' && k in o ? o[k] : def; 
 
    }, object); 
 
} 
 

 
var object = { plantService: { plants: [{ Name: [{ value: 42 }] }] } }; 
 

 
console.log(getIn(object, ['plantService', 'plants', 0, 'Name', 0, 'value'], 'default value')); 
 
console.log(getIn(object, ['b', 'c', 'd', 'e'], 'default value'));

+1

पर समय नहीं है मेरे लिए सबसे अच्छा तरीका ... फिर भी मुझे उम्मीद थी कि कुछ अच्छा था :) – David

2

आप की तरह अपने दम पर एक साधारण समारोह लिख सकता है,

function getVal(obj, propQueue, defaultValue) { 
    for (var prop of propQueue) { 
    if ((obj = obj[prop]) === undefined) { 
     break; 
    } 
    } 

    return obj || defaultValue; 
} 

अब आप इसे पसंद कॉल कर सकते हैं,

var value = getVal(this, ["plantService", "plants", id, "name" 0], ""); 
console.log(value); //either "" or the real value. 
0

आप इस कोशिश कर सकते हैं:

if(this.plantService.plants[id] && this.plantService.plants[id].Name && this.plantService.plants[id].Name[0]){ 
     return this.plantService.plants[id].Name[0].value; 

     }else{ 

    return ''; 
} 

या हो सकता है आपके समस्या यह है कि अपने मॉडल पूरा नहीं हुआ है और आप इन सत्यापन को रोकने के लिए इस बात का यकीन है कि होने की जरूरत है और इसके साथ प्रतिस्थापित करें:

return this.plantService.plants[id].Name[0].value; 
संबंधित मुद्दे