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

React中如何提取数据集唯一值并渲染侧边栏过滤选项?

解决方案

核心思路:先提取唯一标题,再渲染列表

原代码的问题在于循环逻辑混乱,每次渲染都重复遍历数据集且去重逻辑失效。可以用Set快速实现去重,步骤如下:

  1. 提取并去重标题
    在组件内部先处理PRODUCTS,提取每个漫画的标题(逗号前部分),利用Set自动去重的特性得到唯一标题数组:
const uniqueTitles = [...new Set(PRODUCTS.map(product => product.name.split(",", 1)[0]))];

注:split(",",1)返回的是数组,所以要加[0]取出字符串值,否则Set会把数组当成不同元素,无法去重。

  1. 渲染唯一标题列表
    直接遍历去重后的数组生成<li>,用标题作为key(保证唯一性):
import React from "react";
import { PRODUCTS } from "../Utilities/PRODUCTS";
import "./SideNav.scss";

const SideNav = (props) => {
    // 提取并去重标题
    const uniqueTitles = [...new Set(PRODUCTS.map(product => product.name.split(",", 1)[0]))];

    return (
        <div className="sideNav-container">
            <div className="sideNav-title"></div>
            <ul>
                {uniqueTitles.map(title => (
                    <li key={title}>{title}</li>
                ))}
            </ul>
        </div>
    );
};

export default SideNav;

原代码问题分析

  • arr变量重置:let arr = []在组件每次渲染时都会重置为空,无法累积去重结果;
  • 循环嵌套错误:在PRODUCTS.map内部又遍历整个PRODUCTS,导致每个产品都被处理15次,重复注入数据;
  • return时机错误:内层循环中提前return null或单个<li>,导致map只返回第一个符合条件的元素,后续元素被忽略。

替代方案(不用Set,用filter)

如果偏好使用filter方法,可以结合findIndex实现去重:

const uniqueTitles = PRODUCTS.map(product => product.name.split(",",1)[0])
    .filter((title, index, self) => self.findIndex(t => t === title) === index);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:30:18