JavaScript 查找数组中数组的最小值/最大值。
假设我们有一个用户数组,但每个用户本身也是一个数组。
例如,我们将使用以下数据。
const users = [
['Nicole', 31],
['Chris', 33],
['Yaatree', 2],
['Sanne', 29],
];
如您所见,每个用户数组包含两个对象:
- 用户名
- 用户年龄
如何快速返回年龄最大的用户和年龄最小的用户?
我们一起来找出答案。
从数组的数组中找出最大值
首先,我们需要找到一种提取数据的方法,我认为这种reduce方法非常适合。
使用此方法的诀窍在于不要传递初始值。这样,我们就可以只从实际的元素数组开始计数。
const highest = users.reduce((previous, current) => {
return current[1] > previous[1] ? current : previous;
});
console.log(highest);
// [ 'Chris', 33 ]
我们来看看效果如何。
提醒一下,reduce 函数遍历数组中的每个元素需要两个参数。
- 前值:之前的累计值
- 当前项:当前循环项
然后,我们检查当前项的属性1(即年龄)是否大于上一项。
如果是,则返回当前项,因为它更大。否则,返回上一项的值。
在我们的循环中,它的工作方式如下:
- 当前 = 妮可,不存在任何东西,所以妮可成为最高值
- current = Chris,Chris 的年龄比 Nicole 大,所以 Chris 将成为返回值。
- 当前值为 Yaatree,Chris 的值更高,因此继续返回 Chris 作为最高值。
- 当前排名 = Sanne,Chris 的排名仍然更高,所以保留 Chris
最终,克里斯的价值最高。
从数组的数组中找出最小值
但是,如果我们采用同样的方法,但想找到一个更低的年龄呢?
我们可以使用相同的 reduce 函数,但交换箭头。
const lowest = users.reduce((previous, current) => {
return current[1] < previous[1] ? current : previous;
});
console.log(lowest);
// [ 'Yaatree', 2 ]
请注意,我们已将 切换>为<。
为了更清楚地解释,以下是操作流程:
- 当前值为妮可,不存在任何东西,所以妮可成为最低值
- 当前值为 Chris,Nicole 的值较低,因此继续返回 Nicole 作为最低值。
- current = Yaatree,Yaatree 较小,因此返回 Yaatree
- current = Sanne,Yaatree 值较低,因此返回 Yaatree
结果是 Yaatree 的排名最低。
优化 reduce 方法
为了方便您阅读,我决定重新编写 reduce 函数。
然而,这是没有必要的,我们可以使用简写函数。
const highest = users.reduce((prev, cur) => (cur[1] > prev[1] ? cur : prev));
const lowest = users.reduce((prev, cur) => (cur[1] < prev[1] ? cur : prev));
这段代码可能有点难读,但我们去掉了包裹的花括号,这样就省略了 return 语句,因为它们直接返回。
处理空数组
但如果数组为空会发生什么情况?
我们将收到以下错误:TypeError: Reduce of empty array with no initial value。
这是因为我们没有给 reduce 方法提供初始值。
我们可以添加一个空null值作为回退值。
为了使 reduce 操作生效,我们还需要从前一个值开始评估;这样,另一个返回值始终是当前值。
const users = [];
const highest = users.reduce((previous, current) => {
return previous?.[1] > current[1] ? previous : current;
}, null);
console.log(highest);
// null
希望您喜欢这篇文章。欢迎在下面的 CodePen 示例中进行尝试。
感谢阅读,让我们保持联系!
感谢您阅读我的博客。欢迎订阅我的电子邮件简讯,也可以在Facebook或Twitter上关注我。
文章来源:https://dev.to/dailydevtips1/javascript-find-minmax-from-array-of-arrays-1bkg