2016-05-18 7 views
0

以下の関数は、以下を行います。どのようにしてコードを実行すると、条件を渡しても関数を実行できないのですか?

1)オブジェクトに空でないカテゴリ(特定の名前のキー)があるかどうかを確認します。

2)これらのカテゴリ内の各オブジェクトを確認します。オブジェクトがwebのプロパティを持ち、プロパティが空でも定義されていない場合は、falseを返します。

3)最後のビットは同じですが、プロパティwebがカテゴリに含まれていないオブジェクト内にある場合。コードは時々// STUCK HEREで停止し、決してとき

hasNoCategories (object) { 
    for (let key in object) { 
    const value = object[key] 
    const isCategory = this.categories.indexOf(key) > -1 
    if (value.constructor === Array && isCategory && value.length > 0) { 
     let result 
     value.map(pano => { 
     if (pano.web !== undefined && pano.web !== '') { 
      result = false 
     } 
     }) 
     // STUCK HERE 
     return result 
    } 
    if (key === 'web' && value !== '') { 
     return false 
    } 
    } 
    return true 
}, 

しかし、それは終わりでtrueを返すようになります。

回避策の一つがこれです:

if (pano.web !== undefined && pano.web !== '') { 
    result = false 
} else { 
    result = true 
} 

しかし私混乱の2 return trueを持つ反対だ、私はそれを感じる種類のロジック(私はちょうど1 return true、端に1つを持っていると思います。)

コードを変更してコードが// STUCK HEREに滞っていないようにして、return trueに達するまで続けますか?

EDIT:

サンプル入力:

{ 
    "livingroom": [], 
    "diningroom": [], 
    "kitchen": [], 
    "bedroom": [], 
    "study": [], 
    "bathroom": [], 
    "toilet": [], 
    "garden": [], 
    "garage": [], 
    "outdoors": [], 
    "other": [], 
    "id": "ZI4hteKxgr", 
    "name": "Cuiti", 
    "description": "", 
    "visible": true, 
    "user": "", 
    "floorplan": "", 
    "shareCode": "http://vrviewer.istaging.co#!/854703", 
    "date": "2016/5/13", 
    "isDirty": false 
} 
+0

リターンになると、この機能は停止します。 [こちら](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return#Description)と[this](https://developer.mozilla.org/en- – zer00ne

+0

最初の 'if'文で、' result'が 'false'にならなければ' undefined'を返し、関数は@ zer00neのように終わります。と述べた。 – DonovanM

+0

@DonovanMどうすれば関数が再開し、 'undefined'を返すときに終了しないのですか? – alex

答えて

2

これは最初のif文のforループの代わりに、mapを使用してこれを行うの一例です。

hasNoCategories (object) { 
    for (let key in object) { 
    const value = object[key] 
    const isCategory = this.categories.indexOf(key) > -1 
    if (value.constructor === Array && isCategory && value.length > 0) { 
     for (let i = 0, len = value.length; i < len; i++) { 
     let pano = value[i] 
     if (pano.web !== undefined && pano.web !== '') { 
      return false 
     } 
     } 
    } 
    if (key === 'web' && value !== '') { 
     return false 
    } 
    } 
    return true 
} 

これはおそらくよりクリーンな方法で実行できます。私はforループは、コードがよりクリーンでないように見える傾向があると思う。

+0

はい、同意します。私は 'forループ'を使用しない方法を考えることはできません – alex

関連する問題