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

React项目中实现按数组索引为JSON加载的分类数据匹配对应图标

解决JSON加载后分类图标全部显示相同的问题

我来帮你搞定这个问题!首先咱们得搞清楚为啥现在所有图标都一样:你在catWomen、catMen、catKids的map函数里,把所有项的icon都硬写成了<Icons2.hat02 />,完全没按照之前硬编码版本里的规则对应不同图标,这就是问题根源。

下面给你两种解决方案,第一种是你要求的else if方式,第二种是更简洁易维护的映射对象方案,都能完美匹配你原来的硬编码逻辑:


方案1:用else if条件判断(完全符合你的需求)

直接在map循环里根据每个分类项的id来匹配对应图标,和你注释里的硬编码逻辑完全对齐:

// 处理Women分类
const catWomen = catData.catWomen.map((data) => {
  let icon;
  if (data.id === 1) {
    icon = <Icons2.seeall />;
  } else if (data.id === 2) {
    icon = <Icons2.frock01 />;
  } else if (data.id === 3) {
    icon = <Icons2.shoes06 />;
  } else if (data.id === 4) {
    icon = <Icons2.purse01 />;
  } else if (data.id === 5) {
    icon = <Icons2.bag05 />;
  } else if (data.id === 6) {
    icon = <Icons2.hat02 />;
  }
  return {
    id: data.id,
    name: data.name,
    icon: icon,
    childs: data.childs
  };
});

// 处理Men分类
const catMen = catData.catMen.map((data) => {
  let icon;
  if (data.id === 1) {
    icon = <Icons2.seeall />;
  } else if (data.id === 2) {
    icon = <Icons2.shirt1 />;
  } else if (data.id === 3) {
    icon = <Icons2.shoes1 />;
  } else if (data.id === 4) {
    icon = <Icons2.bag05 />;
  } else if (data.id === 5) {
    icon = <Icons2.purse02 />;
  } else if (data.id === 6) {
    icon = <Icons2.hat />;
  }
  return {
    id: data.id,
    name: data.name,
    icon: icon,
    childs: data.childs
  };
});

// 处理Kids分类
const catKids = catData.catKid.map((data) => {
  let icon;
  if (data.id === 1) {
    icon = <Icons2.seeall />;
  } else if (data.id === 2) {
    icon = <Icons2.shirt1 />;
  } else if (data.id === 3) {
    icon = <Icons2.shoes05 />;
  } else if (data.id === 4) {
    icon = <Icons2.bag05 />;
  } else if (data.id === 5) {
    icon = <Icons2.bow />;
  } else if (data.id === 6) {
    icon = <Icons2.hat03 />;
  }
  return {
    id: data.id,
    name: data.name,
    icon: icon,
    childs: data.childs
  };
});

方案2:用映射对象(更简洁,后续维护更方便)

如果以后要新增分类或者修改图标,一堆else if改起来很麻烦,用映射对象就清爽多了,先定义好每个分类的图标对应关系,再直接映射:

// 先定义各分类的图标映射表
const womenIconMap = {
  1: <Icons2.seeall />,
  2: <Icons2.frock01 />,
  3: <Icons2.shoes06 />,
  4: <Icons2.purse01 />,
  5: <Icons2.bag05 />,
  6: <Icons2.hat02 />
};

const menIconMap = {
  1: <Icons2.seeall />,
  2: <Icons2.shirt1 />,
  3: <Icons2.shoes1 />,
  4: <Icons2.bag05 />,
  5: <Icons2.purse02 />,
  6: <Icons2.hat />
};

const kidsIconMap = {
  1: <Icons2.seeall />,
  2: <Icons2.shirt1 />,
  3: <Icons2.shoes05 />,
  4: <Icons2.bag05 />,
  5: <Icons2.bow />,
  6: <Icons2.hat03 />
};

// 快速映射分类数据,...data是直接复制原有属性,再加上icon
const catWomen = catData.catWomen.map(data => ({
  ...data,
  icon: womenIconMap[data.id] || <Icons2.hat02 /> // 加个默认图标防止找不到对应id的情况
}));

const catMen = catData.catMen.map(data => ({
  ...data,
  icon: menIconMap[data.id] || <Icons2.hat />
}));

const catKids = catData.catKid.map(data => ({
  ...data,
  icon: kidsIconMap[data.id] || <Icons2.hat03 />
}));

小提示

两种方案都能实现和你之前硬编码版本完全一样的图标显示效果。如果你的分类以后可能会变动,我更推荐方案2,维护起来省心很多~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:02:33