繁体   English   中英

编写此 JS reduce() 代码的更好方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM