2016-11-22 50 views
5

考慮這個例子:很好的方式,如果在JavaScript對象鏈是有效

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 erator在你的如果是這樣的:'if(this.plantService.plants [id] && this.plantService.plants [id] .Name && this.plantService.plants [id] .Name [0]){return this.plantService。植物[id] .Name [0] .value} else {return''}' –

+0

請向我們展示拋出的異常。你只是說有,但那是什麼? –

+1

@SuperCoolHandsomeGelBoy這將是一個'TypeError',因爲您試圖訪問'undefined'上的屬性。 –

回答

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; 
相關問題