2017-01-24 6 views
0

オンライングレーダの条件の大部分は、最後のプロパティが存在しない場合存在しなければundefinedを返します)。Javascriptでプロパティの最後の要素を取得し、未定義の場合はundefinedを返します。

グレーダーが「TypeError:obj [key] is undefined」と言っています。たぶんこれは簡単ですが、私が逃しているものは得られません。ここに私がこれまで持っているものがあります。

function getLastElementOfProperty(obj, key) { 
 
    var length = obj[key].length 
 
    if(length === 0){ 
 
     return undefined 
 
    } 
 
    if(!Array.isArray(obj[key])){ 
 
     return undefined 
 
    } 
 
    if(obj[key].length === 0){ 
 
     return undefined 
 
    } 
 
    else{ 
 
    return obj[key][length-1] 
 
    } 
 
}

答えて

1

修正コードとOBJを追加し、[キー]検証

function getLastElementOfProperty(obj, key) { 
    var returnVal; 
    if(obj[key]){ 
     var isArray = Array.isArray(obj[key]), 
      length = obj[key].length; 
     if(isArray && length){ 
     returnVal = obj[key][length - 1]; 
     } 
    } 
    return returnVal; 
} 
+0

ミニマリズムになりたい場合は? – Justinas

+0

これは正しい答えです。私は完全にそれを得るためにそれを試してみるつもりです。皆さん、私を助けてくれてありがとう。私はそれが私を許可するときに私はそれを数分で受け入れます。 – Milos

+0

@Justinas - そうです。コードを更新しましょう。 (注意 - 長さのチェックはちょっと慎重であるかもしれませんが、isArray checkを使用している場合はおそらく必要ありません) – Kunal

1

obj[key]が存在しない場合、obj[key].lengthをしようとするとエラーになります。そのような場合をキャッチするその前にチェックを行います。そのようなキーが存在しないとき、それはundefined.lengthに変換されるため

if (typeof obj[key] === "undefined") 
2

obj[key].lengthは、エラーがスローされます。このコードへ

変更を:

if (typeof obj[key] === 'undefined') { 
    return undefined; 
} 

あなた場合の最適化:条件セグメントの場合にを見つけた場合

if (typeof obj[key] !== 'undefined' && Array.isArray(obj[key]) && obj[key].length !== 0) { 
    return obj[key][length-1]; 
} 

return undefined; 

パーサーは、さらに条件を評価しません。例えば。

function getLastElementOfProperty(obj, key) { 
    return typeof obj[key] !== 'undefined' && Array.isArray(obj[key]) && obj[key].length !== 0 
     ? obj[key][length-1] 
     : undefined; 
} 
0

することができます:typeof obj[key] === 'undefined'かどうかはArray.isArray(obj[key])

だから、基本的に、あなたの関数は、単一のライニングに変換できるかどうかを確認しませんよりも、他のすべてのチェックを行う前に、

if (!(key in obj)) return "undefined"; 

を試してみてください。

最も簡単なコードがarray[-1]undefinedであり、あなたがオブジェクトとしてnull /未定義などに合格した場合ノーリターンを持たないことobj &&の戻り未定義

テストと同じであるので、それは

を壊さないという事実を使用しています

1

ので、それだけで

function getLastElementOfProperty(obj, key) { 
    if (obj && Array.isArray(obj[key])) { 
     return obj[key][obj[key].length - 1]; 
    } 
} 

あなたは

にreturn文を変更することができます

あなたが最初のオブジェクトの長さを受け取り、唯一それが配列の場合はチェックよりも、なぜ

function getLastElementOfProperty(obj, key) { 
    return ((obj && Array.isArray(obj[key]) && obj[key].slice(-1)) || []).pop(); 
} 
関連する問題