React中如何在新数组映射图标?遇[object Object]问题求助
问题原因与解决方案
问题根源
你看到[object Object]是因为item.icon是对象类型,JavaScript里对象和字符串直接拼接时,会自动把对象转为默认的字符串表示[object Object]。另外你当前用item.category + item.icon作为Set的元素,既没法正确保留图标对象,也达不到按分类去重的目的。
解决方案
根据你的需求,提供两种处理方式:
方式1:按分类去重,同时保留对应图标
如果要保留每个分类的图标,先通过Map建立分类和图标的映射关系,再转换为目标数组:
import { skillData } from '../../data/pageData'; // 建立分类与图标的映射,自动去重分类 const categoryIconMap = new Map(); skillData.forEach(item => { // 这里只保留首次出现的分类图标,若要保留最后出现的,去掉if判断直接set即可 if (!categoryIconMap.has(item.category)) { categoryIconMap.set(item.category, item.icon); } }); // 转换成包含'All'的目标数组 const allfilteredSkills = [ 'All', ...Array.from(categoryIconMap.entries()).map(([category, icon]) => ({ category, icon })) ]; console.log(allfilteredSkills);
方式2:先提取唯一分类,再匹配对应图标
先通过Set获取所有唯一分类,再为每个分类匹配对应的图标:
import { skillData } from '../../data/pageData'; // 获取所有唯一分类 const uniqueCategories = [...new Set(skillData.map(item => item.category))]; // 生成包含分类和对应图标的数组 const allfilteredSkills = [ 'All', ...uniqueCategories.map(category => { // 找到当前分类对应的第一个图标,可根据需求调整匹配逻辑 const targetItem = skillData.find(item => item.category === category); return { category, icon: targetItem.icon }; }) ]; console.log(allfilteredSkills);
关键注意事项
- 永远不要直接拼接对象和字符串,要根据图标的实际类型(比如React组件、图片URL)直接保留使用
- 用Set去重时,要针对
item.category这种字符串类型的字段,不要用对象参与拼接或去重
内容的提问来源于stack exchange,提问作者Mahmudul Amin Fahim
相关产品推荐
相关产品推荐

