对象数组,当我寻找最大值时,使我的代码可读的最佳实践是什么

object array, what are the best practices to make my code readable when I'm looking for a maximum value

我有这段代码可以从对象数组中找到最大值,其中数字是字符串的一部分:

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++)

你能找到更多信息并解释一下为什么我需要这样做吗?此代码应该是最快的,并且具有良好的代码规则。

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

Try it

一些高级建议:

  • 如果存在执行该工作的数组原型,则不要使用 for 循环:例如Array.mapMath.reduce。这个想法是消除循环迭代器临时变量。有时,当您找到最合适的 Array 原型方法时,您会发现像 i 这样的循环迭代器变得不必要了。找到合适的迭代器方法可以是真正的gem并且节省大量代码。
  • 使用 Math.max 而不是 if 语句。这里的想法是大多数时候我们在整个代码中都以 if 语句开始。最终,当我们学会更好地利用 javascript 时,我们发现我们不需要它。
  • 使用 apply 使 Math.max 在列表上工作。大多数 javascript 函数都适用于参数和数组。数组形式通常更难阅读且容易被忽视,但可以为您节省大量时间。 Math.max.apply.
  • 使用正则表达式捕获组,例如/(\d+)/,这将为您解析字符串并提取数字部分。这是在 v8 引擎中完成的,无需您在 javascript
  • 中做繁重的工作
  • 不需要 Regexp 对象,您可以在代码中直接使用 regexp,取消对字符串的引号并使用斜杠。

以上是吃的一般规律。我可以想出多种解决方案来解决您的问题:

  1. Array.map、正则表达式、parseInt、Math.max.apply
  2. Array.reduce、正则表达式、parseInt、Math.max

您可以像另一个 OP 发布的那样用 split 替换正则表达式。

有很多解决方案。

我最喜欢的是 Math.reduce,因为它将数组压缩成一个结果。但你面临的挑战是弄清楚,因为语法不欢迎新手。

减少数组的其他解决方案:

'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);

这可能不是最简单的方法,但它是另一种使用函数式 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/ramda@latest/dist/ramda.min.js"></script>