我有这段代码,它从对象数组中查找最大值,其中数字是字符串的一部分:
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++)
您能找到更多信息并解释一下为什么我需要这样做吗?这段代码应该是最快的,并且符合良好的代码规则。
最佳答案
一些高级建议:
- 如果存在可以完成这项工作的数组原型(prototype),则不要使用 for 循环:例如Array.map 和 Math.reduce。这个想法是消除循环迭代器临时变量。有时,当您找到最合适的数组原型(prototype)方法时,您会发现像
i
这样的循环迭代器变得不必要。找到正确的迭代器方法可能是一个真正的 gem ,并且可以节省大量代码。 - 使用
Math.max
代替if
语句。这里的想法是,大多数时候我们在整个代码中都以if
语句开始。最终,当我们学会更好地利用 javascript 时,我们发现我们不需要它。 - 使用
apply
使Math.max
在列表上工作。大多数 javascript 函数都适用于参数和数组。数组形式通常难以阅读并且容易被忽视,但可以节省大量时间。Math.max.apply
。 - 使用正则表达式捕获组,例如
/(\\d+)/
,这将为您解析字符串并提取数字部分。这是在 v8 引擎中完成的,无需您在 javascript 中进行繁重的工作 - 不需要 Regexp 对象,您可以在代码中直接使用 regexp,取消引用字符串并使用斜杠。
以上是一般规则。我可以想出多种解决方案来解决您的问题:
- Array.map、正则表达式、parseInt、Math.max.apply
- Array.reduce、正则表达式、parseInt、Math.max
您可以将正则表达式替换为 split,正如另一个 OP 所发布的那样。
解决方案有很多。
我最喜欢的是 Math.reduce,因为它将数组压缩为单个结果。但您面临的挑战是弄清楚它,因为该语法不欢迎新手。
关于javascript - 对象数组,当我寻找最大值时,使我的代码可读的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46867921/