如何优化多维数组中指定位置最大值对应子数组首元素的获取逻辑?
优化多维数组找指定位置最大值对应子数组首元素的实现
你的需求是从多维数组里找到子数组指定索引(这里是索引1)数值最大的项,返回其首个元素。原代码能正常运行,但可以从遍历次数、内存占用两方面优化,下面给出几种更高效简洁的实现方式:
原代码回顾
slidesArray = [["1",500],["2",750],["3",501]]; var EmpArr = [] var x = 0; var len = slidesArray.length; for (x; x < len; x++) { EmpArr.push(Math.max(slidesArray[x][1])) } var largestResult = Math.max(...EmpArr); var result = slidesArray.filter(function(v,i) { return v[1] === largestResult; });
原代码需要遍历数组两次,还额外创建了EmpArr存储中间值,对于大数据量的数组,效率和内存利用都有优化空间。
方案1:单次遍历取首个最大值项(最优)
用Array.reduce()一次遍历完成,不需要额外数组,直接跟踪当前最大值对应的子数组:
const slidesArray = [["1",500],["2",750],["3",501]]; // 遍历过程中始终保留数值最大的子数组 const maxItem = slidesArray.reduce((prev, curr) => { return curr[1] > prev[1] ? curr : prev; }); // 取子数组的首个元素 const result = maxItem[0]; console.log(result); // 输出 '2'
优势:仅遍历数组1次,无额外内存开销,时间复杂度O(n),是性能最优的方案。如果有多个子数组的索引1值同为最大值,这个方案会返回第一个遇到的项。
方案2:处理多个最大值项的场景
如果需要返回所有索引1值为最大值的子数组的首个元素,可以用一次遍历同时跟踪最大值和结果集合:
const slidesArray = [["1",750],["2",750],["3",501]]; const { results } = slidesArray.reduce((acc, item) => { if (item[1] > acc.maxValue) { // 遇到更大值,重置最大值和结果数组 return { maxValue: item[1], results: [item[0]] }; } else if (item[1] === acc.maxValue) { // 遇到等值,添加到结果数组 acc.results.push(item[0]); } return acc; }, { maxValue: -Infinity, results: [] }); console.log(results); // 输出 ['1', '2']
优势:同样只遍历1次,同时处理最大值和多结果的情况,避免了先找最大值再过滤的两次遍历操作。
方案3:简洁版(适合小数据量)
如果数组规模不大,追求代码简洁性,可以用map+Math.max+filter的组合,比原代码更简洁:
const slidesArray = [["1",500],["2",750],["3",501]]; // 先提取所有索引1的值,找到最大值 const maxVal = Math.max(...slidesArray.map(item => item[1])); // 过滤出所有符合条件的子数组,再提取首元素 const results = slidesArray.filter(item => item[1] === maxVal).map(item => item[0]); console.log(results); // 输出 ['2']
注意:这个方案还是需要遍历数组2次,适合数据量小的场景,胜在代码直观易读。
内容的提问来源于stack exchange,提问作者ccdavies
相关产品推荐
相关产品推荐

