JavaScript中获取多维数组对象匹配元素索引的最优方法
F1赛事数据查询问题解决
需求说明
我正在为一级方程式(Formula One)赛事创建赛季积分表,数据采用多维数组结构:每个赛季是一个数组,赛事对应其中的对象,每个对象存储参赛车手的车号(driver数组)和发车格号(grid数组)。
需要实现的功能是:找出所有参加第4场比赛的车手对应的driver索引和grid数组索引,返回格式为二维数组,例如[[3,1],[6,2]],代表f1[0][0].race[0].driver[3][1] = 4且f1[0][0].race[0].driver[6][2] = 4。
尝试过用reduce方法,但在f1[0][0]这类多维结构中无法正确使用;知道用for循环能实现,但数据量增大后效率偏低。
相关代码
f1 = []; f1[0] = []; f1[0][0] = {}; f1[0][0].race = []; f1[0][0].race[0] = {}; for(n=0; n<=10; n++){ f1[0][0].race[0].driver[n] = []; f1[0][0].race[0].grid[n] = []; }; f1[0][0].race[0].driver[3] = [2,4,6,8,10]; f1[0][0].race[0].grid[3] = [4,9,3,2,7]; f1[0][0].race[0].driver[6] = [1,3,4,6]; f1[0][0].race[0].grid[6] = [3,7,2,1]; f1[0][0].race[0].driver[8] = [2,3,8]; f1[0][0].race[0].grid[8] = [5,4,1];
解决方案
可以结合Object.entries和flatMap来高效处理,既避免嵌套循环的冗余,又能清晰遍历多维结构:
const targetRaceNumber = 4; const raceData = f1[0][0].race[0]; const result = Object.entries(raceData.driver) .flatMap(([driverIndex, races]) => { // 筛选当前车手参加第4场比赛的索引 return races.map((num, gridIndex) => num === targetRaceNumber ? [parseInt(driverIndex), gridIndex] : null) .filter(item => item !== null); }); console.log(result); // 输出 [[3,1],[6,2]]
代码说明
Object.entries(raceData.driver):将driver对象转换为键值对数组,键为车手索引(字符串类型),值为该车手参加的赛事编号数组flatMap:遍历每个车手数据,同时将子数组扁平化,避免返回嵌套数组结构- 内层
map+filter:筛选出赛事编号等于目标值的条目,转换为[车手索引, grid数组索引]格式,过滤掉不符合条件的null值
这种方法比纯for循环更简洁,且大数据量下性能更优,因为它利用了JS引擎对数组方法的优化实现。
内容的提问来源于stack exchange,提问作者S.S
相关产品推荐
相关产品推荐

