如何从对象数组提取views值为单数组并获取前两大值
问题解决:提取对象数组的views并获取最大两个值
原代码问题分析
你当前的代码里,map回调函数每次都会新建一个空数组myArr,然后只把当前元素的views推进去,再取这个单元素数组的最大值,所以每次输出的都是单个views值,根本没法生成合并后的目标数组。
正确实现步骤
- 提取views数组:用
map直接返回每个元素的views,就能得到你要的[5678, 2500, 3500, 1250]。 - 获取最大的两个值:有两种常用方式:
- 方式一:先对数组降序排序,再取前两个元素(简单直观)
- 方式二:遍历数组一次,记录最大和第二大的值(性能更优,适合大数据量)
代码实现
方式一:排序法
const data = [ { id: 1, views: 5678, textData: "Sun" }, { id: 2, views: 2500, textData: "Moon" }, { id: 3, views: 3500, textData: "Earth" }, { id: 4, views: 1250, textData: "Sky" } ]; // 提取views数组 const viewsArr = data.map(item => item.views); // 降序排序后取前两个 const topTwo = viewsArr.sort((a, b) => b - a).slice(0, 2); console.log(viewsArr); // 输出 [5678, 2500, 3500, 1250] console.log(topTwo); // 输出 [5678, 3500]
方式二:遍历找最值法
const data = [ { id: 1, views: 5678, textData: "Sun" }, { id: 2, views: 2500, textData: "Moon" }, { id: 3, views: 3500, textData: "Earth" }, { id: 4, views: 1250, textData: "Sky" } ]; const viewsArr = data.map(item => item.views); let firstMax = -Infinity; let secondMax = -Infinity; for (const num of viewsArr) { if (num > firstMax) { secondMax = firstMax; firstMax = num; } else if (num > secondMax && num !== firstMax) { secondMax = num; } } const topTwo = [firstMax, secondMax]; console.log(viewsArr); // 输出 [5678, 2500, 3500, 1250] console.log(topTwo); // 输出 [5678, 3500]
内容的提问来源于stack exchange,提问作者soccerway
相关产品推荐
相关产品推荐

