2017-10-21 12 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++)

당신이 더 많은 것을 발견하고 내가 그것을 할 필요가 왜 나를 설명 할 수 예를 들어 내가 사용할 필요가? 이 코드는 좋은 코드 규칙을 사용하여 가장 빠르며 contaible해야합니다.

+0

무엇을 당신의 마지막 [질문]의 대답 (https://stackoverflow.com/questions/46866104/finding-maximum-value-in-an-array- 작동하지 않습니다 오브 - 오브 - 오브 - 오브 - 오브 - 오브 - 오브 - 스트링 - 모)? –

답변

1

일부 높은 수준의 제안 :

  • 일을 할 배열의 프로토 타입이 존재하는 경우 루프에 사용 해달라고 : 예를 들어, Array.mapMath.reduce. 아이디어는 루프 반복자 임시 변수를 제거하는 것입니다. 때로는 가장 적절한 Array 프로토 타입 메서드를 찾을 때 i과 같은 루프 반복자가 불필요하게됩니다. 올바른 반복자 방법을 찾는 것은 진정한 보석이 될 수 있으며 많은 코드를 절약 할 수 있습니다.
  • if 대신 Math.max을 사용하십시오. 여기에서 우리의 코드 전반에 걸쳐 if 문으로 시작하는 것이 대부분입니다. 결국 우리는 javascript를 더 잘 활용하는 법을 배울 때 필요 없다는 것을 알게됩니다.
  • apply을 사용하면 Math.max을 목록에 적용 할 수 있습니다. 대부분의 자바 스크립트 함수는 인수와 배열에서 작동합니다. 배열 형식은 일반적으로 읽기가 어렵고 간과되지만 시간을 많이 절약 할 수 있습니다. Math.max.apply.
  • 정규식 캡처 그룹을 사용하십시오. /(\\d+)/,이 문자열을 구문 분석하고 숫자 부분을 뽑아. 이것은 자바 스크립트에서 무거운 짐을하지 않고 v8 엔진에서 수행됩니다
  • Regexp 객체가 필요하지 않습니다. 코드에서 regexp direct를 사용할 수 있으며 문자열의 인용 부호를 지우고 슬래시를 사용할 수 있습니다.

위의 일반적인 규칙이 있습니다.

  1. Array.map, 정규식,에서는 parseInt, Math.max.apply
  2. Array.reduce, 정규식,에서는 parseInt, Math.max

당신 : 나는 당신의 문제에 여러 솔루션을 생각할 수 있습니다 다른 OP가 게시 할 때 split으로 정규 표현식을 바꿀 수 있습니다.

많은 솔루션이 있습니다.

내가 선호하는 것은 Math.reduce입니다. 그 이유는 어레이를 단일 결과로 크런치 (crunches)하기 때문입니다. 그러나 당신이 직면 한 도전은이 문법이 신규 이민자를 환영하지 않기 때문에 파악하는 것입니다.

배열 감소
+1

'for' 루프는 모든 배열 반복자 메소드보다 여전히 빠릅니다. –

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

Try it

+0

Math.max 이전에 "_"을 의미하는 것은 무엇입니까? "()"와 같은가요? –

+0

@harry 네, kind of –

0

다른 솔루션 :이 아마 그것을 할 수있는 가장 쉬운 방법은 아니지만, 당신이 유틸리티를 일단 당신이 넣을 수있는 기능 JS 주체를 사용하여 작업을 수행하는 또 다른 방법

'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

을 기능을 모두 레고 블록과 함께 사용할 수 있습니다. 코드의 모든 부분은 모든 유틸리티가 단 하나의 책임을지기 때문에 테스트 할 수 있습니다.

// 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>