2016-04-03 3 views
-2

存在しないかもしれないときに私は次の操作を行うためのエレガントなJavascriptの道を見つけようとしているオブジェクトでOR条件を使用する:Javascriptを:プロパティは

実際に
var c; 
if(obj[i].cost){ 
    c = obj[i].cost.toFixed(2); 
}else{ 
    c = null 
} 

arr.push(c); 

私は5持っている - これらの要素の10をし、私はこれをより効率的にコーディングする方法を見つけようとしています。このような何か:

arr.push(obj[i].cost.toFixed(2) || null) 

は素敵なこと、ないcostプロパティが存在しない場合に壊れるでしょう。

プロパティごとに冗長なif/elseステートメントを実行せずに最小限のコード方法がありますか?

+0

3進演算子はif/elseよりも短くなります。 – nnnnnn

+0

三元声明で何が問題になっていますか? –

+0

本当に短縮したい場合は、3項演算子を使用します。それ以外の場合は、if/elseが最もクリーンです(これは、次のようになります)。arr.push((obj [i] .cost)?obj [i] .cost.toFixed(2)行く道。 – SeinopSys

答えて

3

私は、このようなものConditional (ternary) Operatorを使用することをお勧め:Conditional (ternary) Operatorの詳細については

arr.push(obj[i].cost ? obj[i].cost.toFixed(2) : null) 

を、このlinkをご覧ください。

+0

ああ、優秀。ここでは三項演算子を使うことは考えていませんでしたが、これはきれいです。 – Jascination

+0

これは合法です、私はImがこの方法でもっと多くの方法で三項を使うと思います! – JordanHendrix

+0

ハッピーに助けてください:) – AnhTriet

2

これはいかがですか?

var nullCost = { 
    toFixed: function() { return null; } 
}; 

var c = (obj[i].cost || nullCost).toFixed(2); 
0

私はこのようなものだろう:あなたは、エレガントなJSを書くしようとしているので、私はあなたがCoffeeScriptのに見てください

arr.push((cost = obj[i].cost) && cost.toFixed(2) || null) 

を:

arr.push obj[i].cost?.toFixed(2) 

compiled jsを参照してください。存在しない場合は、技術的にはnullではなく未定義になりますが、CoffeeScriptは一般的にかなり優雅なコードを書くことができます。あなたのコードを考える

0
var c; //initiate variable 
c = obj[i].cost ? obj[i].cost.toFixed(2) : null; //ternary for if/else block 
arr.push(c); //push value to array 
+1

ルールに従ってコードとともに十分な説明を追加する必要があります。 –

+0

はちょっとしたコメントで更新されました。すみません。 –

1

がインデクサでiを使用して、ループの本体に使われている可能性が高いようです。

var c; 
if(obj[i].cost){ 
// ^^^ 
    c = obj[i].cost.toFixed(2); 
//  ^^^ 
}else{ 
    c = null 
} 
arr.push(c); 

私は大きな仮定をしていますので、間違っている可能性が高いので修正してください。

その後、コードをより機能的なものに簡略化することができ、この構造は合理的に正確であると仮定し
var arr = []; 
for (i in obj) { 
    var c; 
    if (obj[i].cost) { 
    c = obj[i].cost.toFixed(2); 
    } else { 
    c = null; 
    } 
    arr.push(c); 
} 

:私は使用がの線に沿って何かを見ていきますと仮定するつもりです。

代わりに、オブジェクトのキーを反復の、あなたがコレクションとしてキーにアクセスして、コレクション全体に関数を適用するために、配列のメソッドを使用することができます。

var arr, 
    obj; 

//this is a utility. It would be nice to have Object.values, 
//but it's not supported in enough browsers yet 
function values(obj) { 
    return Object.keys(obj).map(function (key) { 
    return obj[key]; 
    }); 
} 

//this function gets a cost from a particular value 
//it's reusable and concise 
function getCost(value) { 
    return value.cost 
    ? value.cost.toFixed(2) 
    : null; 
} 

//get the data however you get it 
obj = ...; 

//this is where everything actually happens 
arr = values(obj).map(getCost); 

これは、あなたが書いたものよりも長くなっています元々。それは必ずしも悪いことではありません。

可能な限り短いコードを書く傾向があります。私はあなたに最も読みやすいコードを求めて努力するよう勧めます。読みやすい場合は分かりやすく、分かりやすい場合は簡単にデバッグできます。

例:お客様が指定したコードは、0の値をnullに変換します。これはバグである可能性がありますし、何が書かれているべきことだった。

if (obj[i].cost != null) { 

、あなたのコード内で何度もこのスニペットを再利用する場合は、あなたが複数の場所で同じスニペットを修正する必要があります。

代わりに、この小さなロジックを単純な関数に抽象化しました。そのバグは一度だけ修正する必要があり、残りのコードは固定バージョンを使用します。

関連する問題