根据联赛代码数组生成对应联赛场地对象索引的新数组
根据联赛代码数组生成对应联赛场地对象索引的新数组
嘿,这个需求用map就非常合适,完全不需要用push(),我给你理清楚怎么做:
首先,咱们可以先把league.venue里的每个元素的code和它对应的索引做一个映射表——这样后面查找的时候不用每次都遍历整个数组,效率更高。然后直接用map遍历你的league.code数组,把每个code转换成对应的索引就行。
给你看完整的可运行代码,直接就能得到你要的[4,5,0,3,2]:
// 你提供的原始数据 league = {}; league.venue = []; league.venue[0] = {}; league.venue[0].code = 1000; league.venue[0].team = "Arsenal"; league.venue[1] = {}; league.venue[1].code = 1001; league.venue[1].team = "Spurs"; league.venue[2] = {}; league.venue[2].code = 1002; league.venue[2].team = "Liverpool"; league.venue[3] = {}; league.venue[3].code = 1003; league.venue[3].team = "Manchester City"; league.venue[4] = {}; league.venue[4].code = 1004; league.venue[4].team = "Manchester United"; league.venue[5] = {}; league.venue[5].code = 1005; league.venue[5].team = "Everton"; league.code = [1004, 1005, 1000, 1003, 1002]; // 解决方案部分 // 1. 先建立code到索引的映射表 const codeToIndex = league.venue.reduce((mapping, venueItem, index) => { mapping[venueItem.code] = index; return mapping; }, {}); // 2. 用map遍历code数组,取出对应的索引 const result = league.code.map(code => codeToIndex[code]); console.log(result); // 输出: [4,5,0,3,2]
为什么不用filter呢?因为filter的作用是从数组里筛选符合条件的元素,而咱们这里是要把每个code转换成对应的索引,是一对一的转换,map就是干这个的,完全匹配需求。
另外说一句,用reduce做映射表这一步很重要,如果你的league.venue数组很大,每次用findIndex去查找的话,时间复杂度会是O(n²),而用映射表+map的方式是O(n),效率会高很多。当然如果数组很小的话,其实直接用map+findIndex也能实现,比如:
const result = league.code.map(code => league.venue.findIndex(item => item.code === code));
这个写法更简洁,但如果venue数组元素多的话,性能不如前面的方法。你可以根据实际情况选~
备注:内容来源于stack exchange,提问作者Powl_London
相关产品推荐
相关产品推荐

