2016-11-22 22 views
5

Xét ví dụ sau:đẹp cách để kiểm tra xem một chuỗi đối tượng trong JavaScript là hợp lệ

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 ''; 

Tôi tự hỏi nếu nó có thể đơn giản hóa những gì tôi đang làm gì ở đây.

Mục tiêu của tôi là kiểm tra chuỗi đối tượng this.plantService.plants[id].Name[0] để có giá trị.

Tuy nhiên, nếu tôi chỉ kiểm tra if(this.plantService.plants[id].Name[0]) {...} ngoại lệ sẽ được ném.

Bất kỳ đề xuất nào? :)

+2

bạn có thể sử dụng '&&' op erator trong của bạn nếu như thế này: 'if (this.plantService.plants [id] && this.plantService.plants [id] .Name && this.plantService.plants [id] .Name [0]) {return this.plantService. cây [id] .Name [0] .value} else {return ''} ' –

+0

Hãy cho chúng tôi biết trường hợp ngoại lệ được ném. bạn chỉ nói có, nhưng đó là cái gì? –

+1

@SuperCoolHandsomeGelBoy Nó sẽ là một 'TypeError', như bạn đang cố gắng truy cập một thuộc tính trên' undefined'. –

Trả lời

4

Bạn có thể làm giảm các mảng với các đối tượng, sau khi kiểm tra giá trị và nhập.

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

Có lẽ là cách đẹp nhất cho tôi ... tuy nhiên tôi hy vọng có một cái gì đó đẹp hơn :) – David

2

Bạn có thể viết một hàm đơn giản trên của riêng bạn như thế nào,

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

    return obj || defaultValue; 
} 

Bây giờ bạn có thể gọi nó như thế nào,

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

Bạn có thể thử này:

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 ''; 
} 

Hoặc có thể vấn đề của bạn là mô hình của bạn không đầy đủ và bạn cần phải chắc chắn về điều đó để ngăn chặn những kiểm chứng thực và thay thế bằng điều này:

return this.plantService.plants[id].Name[0].value; 
Các vấn đề liên quan