[英]Better way to write this JS reduce() code?
下面的函数使用 reduce 函数简单地返回给定数组中的最小元素。 但是,我很快意识到如果给定的数组为空,下面的代码会抛出一个 TypeError :
function findSmallestElement(arr) {
return arr.reduce((a,b) => a < b ? a : b); //throws TypeError if arr is an empty array
}
所以我通过在reduce()方法之前加入一个快速的if语句来处理它,如下所示。 我想知道,是否有更优雅/简洁的方法来做到这一点,因为如果数组为空,我必须返回 0?
function findSmallestElement(arr) {
if (arr.length === 0) return 0;
return arr.reduce((a,b) => a < b ? a : b);
}
您可以使用条件运算符并扩展到Math.min
:
const findSmallestElement = arr => arr.length === 0 ? 0 : Math.min(...arr); console.log(findSmallestElement([1, 2, 3])); console.log(findSmallestElement([]));
但
鉴于如果数组为空我必须返回 0?
我认为这是一个错误,或者至少应该被认为是一个错误。 空数组实际上没有最小值。 如果数组是空的,你可能会考虑返回一个普通数字以外的东西,不能被认为是一个普通的最小值。 例如, findSmallestElement([-1])
返回-1
,而findSmallestElement([])
返回 0 也是不直观的。
您可以模拟Math.min
的功能,然后返回Infinity
:
const findSmallestElement = arr => Math.min(...arr); console.log(findSmallestElement([1, 2, 3])); console.log(findSmallestElement([]));
或者也许返回null
。 返回 0令人困惑。
您可以使用基于数组长度的reduce
2nd 参数默认值集。
const smallest = (arr = []) => arr.reduce( (small, curr) => Math.min(small, curr), arr.length > 0 ? Infinity : 0 ); console.log(smallest([9, 2, 4])); console.log(smallest()); console.log(smallest([]));
你可以做:
const findSmallestElement = arr => arr && arr.length ? arr.sort()[0] : 0 console.log(findSmallestElement()) console.log(findSmallestElement([])) console.log(findSmallestElement([4, 5, 1, 2, 3, 6]))
let x = arr.reduce((acc, curr) => {
return acc > curr ? curr : acc
}, arr[0])
您需要做的是将初始值作为第二个参数传递给reduce。 通常我们将 0 作为初始值传递,但根据您的要求,您应该始终传递任何数组元素(就像我所做的那样,第一个元素更透明),否则它将始终返回 0 并且它会是错误的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.