You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

首次调用哈利波特API如何简化图片展示逻辑及实现去重、角色过滤功能

哈利波特API调用代码优化及问题解答

一、现有重复逻辑优化方案

你当前代码的核心问题是重复定义了8个功能完全一致的函数,仅操作的DOM id不同,通过循环+参数化即可大幅简化:

  • 不需要单独定义8个display函数,仅通过索引拼接id即可批量赋值
  • 优化后的基础代码如下:
// API
const url = "http://hp-api.herokuapp.com/api/characters";

fetch(url)
.then(response => response.json())
.then(data => {
  // 循环1-8批量赋值
  for(let i = 1; i <= 8; i++) {
    document.getElementById(`image${i}`).src = data[i].image;
  }
})
.catch(error => console.log("Error: ", error));

直接删除原来8个重复的display函数即可,功能和原有实现完全一致,代码量减少80%以上。

二、随机无重复图片实现方案

不需要做复杂的重复检测,直接用Fisher-Yates洗牌算法打乱有效角色数组后取前8个,天然保证无重复,执行效率更高:
注意首先要过滤掉没有image字段的无效角色(该API部分角色没有返回图片地址)

// 数组洗牌函数
function shuffleArray(arr) {
  for (let i = arr.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [arr[i], arr[j]] = [arr[j], arr[i]];
  }
  return arr;
}

const url = "http://hp-api.herokuapp.com/api/characters";
fetch(url)
.then(response => response.json())
.then(data => {
  // 先过滤出有有效图片的角色
  const validCharacters = data.filter(item => item.image && item.image.trim() !== '');
  // 打乱数组顺序
  const shuffled = shuffleArray(validCharacters);
  // 取前8个赋值给对应img标签
  for(let i = 1; i <= 8; i++) {
    document.getElementById(`image${i}`).src = shuffled[i-1].image;
  }
})
.catch(error => console.log("Error: ", error));

三、隐藏特定角色的实现方案

可以用.style.display = 'none'实现,但这属于兜底方案,最优方案是提前在数据层过滤,根本不渲染不符合要求的角色,性能更高、逻辑更清晰:
比如你要隐藏名字为「Lord Voldemort」的角色,只需要在过滤阶段加判断条件即可:

// 过滤有有效图片、且不是要排除的角色
const validCharacters = data.filter(item => {
  return item.image && item.image.trim() !== '' && item.name !== 'Lord Voldemort';
});

如果是需要在渲染后动态切换显示/隐藏,更推荐用CSS类控制,比直接修改style属性可维护性更强:

.hidden {
  display: none !important;
}

需要隐藏时给对应img加hidden类,需要显示时移除类即可。

内容的提问来源于stack exchange,提问作者Dominick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:06:04