如何在含不同对象名的多维数组中找出最大delay值?
解决多维数组中对象delay属性的最大值查找问题
需求
从128×128×128的三维数组所有元素中,找出每个对象delay属性下first、term、slow、med、fast的最大数值,本例预期结果为360。
原代码问题分析
原代码存在以下关键错误:
- 数组类型混乱:初始化时将三维位置设为空数组,但
Initialize中直接赋值为对象,导致遍历部分元素时出现类型不匹配。 - 无效循环层级:第四层循环遍历元素的
length属性,但对象没有length,空数组也无有效数据,循环无法正确执行。 - 未保留历史最大值:每次计算当前对象的delay最大值时直接覆盖
maxValue,会丢失之前的更大值。 - 无空值判断:数组中大部分位置为空,直接访问
delay会引发错误。
修正后的代码
function Initialize() { ARR[127][1][0] = {name:"Gl", ss:["Z0",127,"B0",1,[58,0]], delay:{first:60, term:220, slow:240, med:188, fast:188}}; ARR[127][127][0] = {name:"Gl Co", ss:["Z0",127,"B0",127,[58,0]], delay:{first:60, term:220, slow:240, med:188, fast:188}}; ARR[127][1][6] = {name:"Gl El", ss:["Z0",127,"B0",1,[58,6]], delay:{first:60, term:310, slow:360, med:245, fast:145}}; ARR[127][127][6] = {name:"Gl El Co", ss:["Z0",127,"B0",127,[58,6]], delay:{first:60, term:310, slow:330, med:245, fast:145}}; } // 修正初始化:三维位置填充null,统一类型 var ARR = new Array(128); for (let val1 = 0; val1 < ARR.length; val1++) { ARR[val1] = new Array(128); for (let val2 = 0; val2 < ARR[val1].length; val2++) { ARR[val1][val2] = new Array(128).fill(null); } } Initialize(); var maxValue = 0; // 遍历三维数组 for (let i = 0; i < ARR.length; i++) { for (let j = 0; j < ARR[i].length; j++) { for (let k = 0; k < ARR[i][j].length; k++) { const item = ARR[i][j][k]; // 跳过空元素,确保存在delay属性 if (item && item.delay) { const currentDelayMax = Math.max(...Object.values(item.delay)); // 更新全局最大值 maxValue = Math.max(maxValue, currentDelayMax); } } } } console.log(maxValue); // 输出360
修正说明
- 统一数组类型:将三维位置初始化为
null,和后续赋值的对象类型匹配,避免遍历错误。 - 简化循环:移除无意义的第四层循环,直接遍历三维数组的每个元素。
- 空值校验:通过
item && item.delay跳过未赋值元素,防止访问不存在的属性报错。 - 保留全局最大值:使用
Math.max(maxValue, currentDelayMax)确保每次只保留更大的数值。 - 快速提取属性值:用
Object.values(item.delay)获取delay的所有属性值,再通过Math.max()快速计算当前对象的delay最大值。
内容的提问来源于stack exchange,提问作者nok
相关产品推荐
相关产品推荐

