2017-06-09 11 views
0

私は、オブジェクトの配列は、名前Javascriptが未定義例外TypeErrorプロパティを持つオブジェクトをループ

xs = [ 
    {name: "Peter"}, 
    {name: "Doe"}, 
    {name: "Parker"}, 
    {name: "John"} 
]; 

を保存xsと呼ばれていると私は、変数が定義されていない場合は、空の文字列を返す関数setEmptyStrを持って

function setEmptyStr(v) { 
    if(typeof v !== 'undefined'){ 
    return v; 
    } else { 
    return ''; 
    } 
} 

私はオブジェクトの配列をループさせようとします(配列よりも長さが長くなります)、配列の長さは4、私は5を試してみます。array.lengthを使用したくありません。

for (var i = 0; i < 5; i++) { 
    console.log(setEmptyStr(xs[i].name)); 
} 

4つの名前は、定義されていないため、成功して戻ります。しかし、第5回は、私は5番目が空の文字列を返すようであるたい

TypeError property 'name' is undefined.

>>Peter 
>>Doe 
>>Parker 
>>John 

Uncaught TypeError: Cannot read property 'name' of undefined

を返すことです。これどうやってするの?私のコードに誤りがありますか?

>>Peter 
>>Doe 
>>Parker 
>>John 
>>"" 
+0

を送っていない持っているかどうかを確認し、実際に 'ARR [5]'あなたはこのエラーを得た理由ですundefined' 'になります。 –

+0

'xs [i]'は 'xs [i] .name'ではなく、未定義のものです。 –

+0

私はそれを試して、それを返しますUncaught TypeError:未定義のプロパティ '名前'を読み取ることができません。私は私のarr [5]が空の文字列を返すことを望みます。これどうやってするの? –

答えて

0

使用この:

xs = [ 
 
    {name: "Peter"}, 
 
    {name: "Doe"}, 
 
    {name: "Parker"}, 
 
    {name: "John"} 
 
]; 
 

 
for (var i = 0; i < 5; i++) { 
 
    console.log(setEmptyStr(xs[i] && xs[i].name)); 
 
} 
 

 
function setEmptyStr(v) { 
 
    if (typeof v !== 'undefined') { 
 
    return v; 
 
    } else { 
 
    return ''; 
 
    } 
 
}

テストxs[i]最初undefinedのプロパティにアクセスしようとするからエラーを防ぐことができます。

+0

ありがとうございました。それは動作します^ _^ –

+0

コードブロックは、通常は有益な答えではなく、ダウンボートを引き付ける可能性がより高くなります。表示しているソリューションが何をしているのか、そのコードがその質問に答える理由/方法を説明してください。 –

+0

私は説明を書いた。私はスタックスニペットを作成したときに明らかに消えました。 – Barmar

0

いいえ、コードにエラーはありませんが、長さよりも長いインデックスを持つ配列をループするのは危険です。このようなエラーが発生します。あなたのコードxs[4]

あなたはこのエラーを得た理由ですundefined次のようになります。

Uncaught TypeError: Cannot read property 'name' of undefined 

だから、ちょうどこのように、このエラーをキャッチし、避ける必要があります。

for (var i = 0; i < 5; i++) { 
    if(xs[i]) 
     console.log(setEmptyStr(xs[i].name)); 
} 
+0

ありがとうございます。うん、今私の虚偽を理解する –

+0

あなたは歓迎です。 –

0

ませはありません未定義:

Uncaught TypeError: Cannot read property 'name' of undefined

したがって実際にはxs [i]は未定義です。あなたのループは5回実行されますが、あなたは4つのelemsしか持っていません。ここで

for(var i=0;i<xs.length;i++) 
+2

OPは "私はarray.length [sic]を使用したくありません" –

+0

質問者は、array.lengthを使用したくないと言ったことを忘れてしまいました。 –

0

for (var i = 0; i < 5; i++) { 
    console.log(setEmptyStr(xs[i].name)); 
} 

あなたはどうかは、その利用可能かどうか確認することなく、個々の配列要素のnameを送信しようとしている:あなたはSHUREする.LENGTHを使用する場合があります。あなたの5番目のエントリでは何も持っていないので、それはundefinedを返します。配列の長さが4であるためです。

ので、あなたはobjectの前には、あなたのコードには誤りがありません、このよう

if(xs[i]) { 
    setEmptyStr(xs[i].name) 
} 
+0

感謝します。 setEmptyStrの前にif文を使用します。 –

+0

あなたは歓迎です:) –

関連する問題