2017-10-21 19 views
0

を探していたときに私のコードが読みやすくするためのベストプラクティスものです:オブジェクト配列、私は数が文字列の一部であるオブジェクトの配列から最大値を求め、このコード持っている最大値

var stringArray = [ 
{ name: 'string 1' }, 
{ name: 'string 2' }, 
{ name: 'string 11' }, 
{ name: 'string 3' }, 
{ name: 'string 10' } 
]; 
var customModuleRe = new RegExp('\\d+'); 
var getCustomModuleNumber = function() { 
    var max = 0; 
    for (var i = 0; i < stringArray .length; i++) { 
     var current = customModuleRe.exec(stringArray [i].name); 
     if (current) { 
      var num = parseInt(current[0]); 
      if (!isNaN(num) && num > max) { 
       max = num; 
      } 
     } 
    } 
    return max; 
}; 

を私は、このコードを清潔で、最も最適で、読みやすく、ES6、清潔度、およびコード品質に適合するように変更する必要があります。たとえば、私が使用する必要があります。

for (let i = 0, j = stringArray.length; i < j; i++)

の代わり:

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

あなたはより多くのを見つけて、私はそれを行う必要があり、なぜ私を説明できますか?このコードは、優れたコード規則でもっとも速く、妥当でなければなりません。

+0

何あなたの最後の[質問]の答え(https://stackoverflow.com/questions/46866104/finding-maximum-value-in-an-array-では動作しません。 of-objects-a-of-part-of-string-mo?)は、 –

答えて

1

いくつかのハイレベルの提案:

  • が仕事をするアレイのプロトタイプが存在する場合、ループのために使用していけない:例えばArray.mapおよびMath.reduce。アイデアは、ループ反復子の一時変数を削除することです。場合によっては、最も適切なArrayプロトタイプメソッドを見つけると、iのようなループイテレータが不必要になることがあります。適切なイテレータメソッドを見つけることは本当の宝石となり、多くのコードを節約できます。
  • ifの代わりにMath.maxを使用してください。ここでの考え方は、ほとんどの場合、コード全体でifのステートメントから始まります。最終的には、javascriptをより有効に活用する方法を学ぶときに、必要がないことがわかります。
  • applyを使用してMath.maxをリストに適用します。ほとんどのjavascript関数は引数と配列の両方で機能します。アレイフォームは一般的に読みにくく見落とされますが、多くの時間を節約できます。 Math.max.apply。正規表現のキャプチャグループを使用します。 /(\\d+)/、これはあなたのための文字列を解析し、数字部分を抜き出します。これは、v8エンジンで行われています。
  • Regexpオブジェクトは必要ありません。あなたのコードでregexp directを使用し、文字列を引用符で囲み、スラッシュを使用することができます。

上記は一般的なルールです。

  1. Array.map、正規表現、のparseInt、Math.max.apply
  2. Array.reduce、正規表現、のparseInt、Math.max

あなた:私はあなたの問題に複数の解決策を考えることができます別のOPが投稿されたときに正規表現を分割して分割することができます。

多くの解決策があります。

私のお気に入りは、配列を単一の結果にクランチするので、Math.reduceです。しかし、あなたが挑戦するのは、構文が新人にとって歓迎されないので、それを理解することです。配列を軽減

+1

です。 'for'ループはまだすべての配列イテレータメソッドより高速です。 –

0
const getMax = _ => 
    Math.max(...stringArray.map(n => 
     n.name.split(" ")[1] 
)); 

Try it

+0

Math.maxの前に "_"を意味するものは?それは "()"と同じですか? –

+0

@harryはい、種類は –

0

その他のソリューション:

'use strict'; 

const stringArray = [ 
    { name: 'string 1' }, 
    { name: 'string 2' }, 
    { name: 'string 11' }, 
    { name: 'string 3' }, 
    { name: 'string 10' }, 
]; 

const max = stringArray.reduce((previousValue, currentElement) => { 
    const currentValue = parseInt(currentElement.name.split(' ', 2)[1], 10) || -Infinity; 
    return (currentValue > previousValue ? currentValue : previousValue); 
}, -Infinity); 

console.log('max value', max); 
0

これはおそらくそれを行うための最も簡単な方法はありませんが、それはあなたがユーティリティをしたら、あなたが置くことができる機能jsのプリンシパルを使用してそれを行うための別の方法ですすべてのユーティリティが単一の責任しか持たないので、コードのすべての部分がテスト可能です。

// import utilities from a library like Ramda.js 
 
const { 
 
    compose, curry, map, reduce, 
 
    prop, max, split, last, match 
 
} = R 
 

 
const stringArray = [ 
 
    { name: 'string 1' }, 
 
    { name: 'string 2' }, 
 
    { name: 'string 11' }, 
 
    { name: 'string 3' }, 
 
    { name: 'string 10' }, 
 
] 
 

 
// read the name property of an object and find the number 
 
const extractNumber = compose(Number, match(/\d+$/), prop('name')) 
 

 
// map over the objects and find the number, then reduce the array of 
 
// numbers to find the highest value 
 
const getMaximumValue = compose(
 
    reduce(max, 0), 
 
    map(extractNumber) 
 
) 
 

 
console.log(
 
    getMaximumValue(stringArray) 
 
)
<script src="//cdn.jsdelivr.net/npm/[email protected]/dist/ramda.min.js"></script>

関連する問題