对象数组,当我寻找最大值时,使我的代码可读的最佳实践是什么
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]
));
一些高级建议:
- 如果存在执行该工作的数组原型,则不要使用 for 循环:例如
Array.map
和 Math.reduce
。这个想法是消除循环迭代器临时变量。有时,当您找到最合适的 Array 原型方法时,您会发现像 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
您可以像另一个 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>
我有这段代码可以从对象数组中找到最大值,其中数字是字符串的一部分:
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]
));
一些高级建议:
- 如果存在执行该工作的数组原型,则不要使用 for 循环:例如
Array.map
和Math.reduce
。这个想法是消除循环迭代器临时变量。有时,当您找到最合适的 Array 原型方法时,您会发现像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
您可以像另一个 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>