2017-02-13 10 views
1

私の角工場サービスでデータを取得する機能があります。オブジェクトを使用する前にオブジェクト内に特定の値が存在することを確認するにはどうすればよいですか?ここJavaScript内のオブジェクトに値が存在するかどうかをチェックする方法

は...私は...

categories.fetch = function(app){ 
    if(!app.subject.name.length){ 
    return false; 
    } 
    var p = Restangular.all('v1/categories').getList({app.subject.name.toUpperCase()}); 
} 

をしようとしてきたものを

おかげ

ので、私はちょうど価値が restanguarコールで使用する前に app.subject.nameであることを確認したいです

答えて

2

あなたのコードでは、lengthプロパティの値を取得し、if/thenテストの目的のために、ブールに変換しようとすると、その値はであることを起こる場合は、このエラーがスローされますされます0。あなたのテストは単純であれば

また、:app.subject.name値は両方完全に有効な値は0またはfalse、同様に、falsy値であることを起こる場合は、偽陽性を取得します。

文字列の場合、最も簡単なテストは、空でない文字列とnull以外の文字列をチェックすることです。値がエンドユーザによって提供された場合は、誤って追加されている可能性のある先頭または末尾のスペースを削除するために、文字列の最初に.trim()を呼び出すことをお勧めします。また

var myObj = { 
 
    test : 0, 
 
    testing : null 
 
} 
 

 

 
// This will fail with an error when the value is null 
 
/* 
 
if(myObj.testing.length){ 
 
    console.log("The testing property has a value."); 
 
} else { 
 
    console.log("The testing property doesn't have a value."); 
 
} 
 
*/ 
 

 
// This will return a false positive when the value is falsy 
 
if(myObj.test){ 
 
    console.log("The test property has a value."); 
 
} else { 
 
    console.log("The test property doesn't have a value."); // <-- Incorretly reports this 
 
} 
 

 
// This explicit test will pass and fail correctly 
 
if(myObj.testing !== "" && myObj.testing !== null){ 
 
    console.log("The testing property has a value."); 
 
} else { 
 
    console.log("The testing property doesn't have a value."); 
 
}

、値が存在する場合、ifの真の枝にあなたのコードを配置し、約return falseを心配しないでください。

categories.fetch = function(app){ 
    if(app.subject.name !== "" && app.subject.name !== null) { 
    var p = 
     Restangular.all('v1/categories').getList({app.subject.name.toUpperCase()}); 
    } 
+2

しかし、lengthプロパティーがfalsyなので、 '!object.length'は、'> 0'であるかどうかをチェックするショートコードになります。 – Connum

+0

これは、 'name'が' notn 'の場合に 'undefined' TypeError'をスローしますapp.subjには存在しませんすべてのectを。 – Pineda

+1

それはもちろんです。それは、存在しないプロパティをチェックするたびに発生します。それは 'sdlfj = 894#$ @ $%$。[] {} {'は構文エラーを投げます。 –

1

hasOwnPropertyを()メソッドは、オブジェクトが指定されたプロパティを持つかどうかを示すブール値を返します。そのような単純なMDN Docs

var priceOfFood = { 
    pizza: 14, 
    burger 10 
} 

priceOfFood.hasOwnProperty('pizza') // true 
priceOfFood['pizza'] // 14 
priceOfFood.hasOwnProperty('chips') // false 
priceOfFood['chips'] // undefined 
+2

プロパティが値を持っているかどうかを確認する方法はどのように役立ちますか?問題は、プロパティが存在するかどうかをチェックする方法ではありませんでした。 –

+0

これは類推による説明です。私は、OPは値をチェックするのではなく、キーを尋ねていると思っています。 –

+2

OPは非常にはっきり言っています:* "私はちょうどrestanguar呼び出しでそれを使用する前にapp.subject.nameの値があることをチェックしたい" * –

0

if(!app.subject.name){ 
     return ; 
    } 
+0

私は他の答えのいくつかに留意したように、これはスローされます値が有効値である0またはfalseのような偽の値である場合は偽陽性です。 –

+0

'if'ステートメントで '0'または 'false'が' true'であるため入力値が文字列であるため、 'if'ステートメントには入りません – Korte

+0

これはテストの記述方法によって異なります。 'if(" 0 "== true){}'は 'false'になり、' if( "0"){} 'は' true'になります。 –

1

私は質問がLodashについて質問はありませんけど、私はそれで多くのことを確認し、この種の操作を行うために管理し、それは完璧に動作します。

categories.fetch = function(app){ 
    if (_.isEmpty(_.get(app, "subject.name"))) { 
    return false; 
    } 
var p = Restangular.all('v1/categories').getList({app.subject.name.toUpperCase()}); 
} 

それとも単に:

categories.fetch = function(app){ 
    if (!_.get(app, "subject.name")) { 
    return false; 
    } 
var p = Restangular.all('v1/categories').getList({app.subject.name.toUpperCase()}); 
} 
あなたは鍵は、あなたがこのようにそれを行うことができ、アプリケーションのオブジェクトの内部で利用できない可能性があることが予想される場合は

categories.fetch = function(app){ 
    if (_.isEmpty(app.subject.name)) { 
    return false; 
    } 
var p = Restangular.all('v1/categories').getList({app.subject.name.toUpperCase()}); 
} 

:あなたのケースでは、このようなものになるだろう

+1

'app.subject.name ===" "'ならば? –

+1

あなたの「完璧な」答えには欠陥があります:https://plnkr.co/edit/2sRu0U4hbOIdVnayW5EP –

+0

そこに問題はありません。再検査することができますか?_.isEmpty(data.career.field) 'はtrueを返します。そのはず。 – Shota

関連する問題