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

React中如何按关联关系过滤两个JSON数组,展示项目及对应参与居民

实现方案

基础实现(数据量不大的场景)

核心逻辑是渲染每个项目时,从居民数组中过滤出关联的居民即可,以下是示例代码:

import { useState } from 'react';

function ProjectList() {
  // 你已经存入state的两个数组,此处仅做示例
  const [residents, setResidents] = useState([]); // 居民信息数组
  const [projects, setProjects] = useState([]); // 项目信息数组

  return (
    <div>
      <h2>项目列表</h2>
      {projects.map(project => (
        <div key={project.id} className="project-item">
          <h3>项目名称:{project.name}</h3>
          <p>项目描述:{project.desc}</p>
          <div className="resident-list">
            <h4>参与居民:</h4>
            {/* 过滤当前项目对应的居民,假设关联规则为居民对象的projectId等于项目id */}
            {residents.filter(resident => resident.projectId === project.id).map(resident => (
              <span key={resident.id} className="resident-tag">
                {resident.name}
              </span>
            ))}
            {/* 如果关联规则是项目对象存储了参与居民的id数组,过滤逻辑改为下方即可
            {residents.filter(resident => project.residentIds.includes(resident.id)).map(...)
            */}
          </div>
        </div>
      ))}
    </div>
  )
}

优化实现(数据量较大的场景)

如果两个数组数据量很大,每次渲染都循环过滤会产生不必要的性能损耗,可以用useMemo提前生成项目id到对应居民数组的映射表,避免重复计算:

import { useState, useMemo } from 'react';

function ProjectList() {
  const [residents, setResidents] = useState([]);
  const [projects, setProjects] = useState([]);

  // 仅当residents数组变化时才重新生成映射表
  const projectResidentMap = useMemo(() => {
    const map = new Map();
    residents.forEach(resident => {
      if (!map.has(resident.projectId)) {
        map.set(resident.projectId, []);
      }
      map.get(resident.projectId).push(resident);
    })
    return map;
  }, [residents]);

  return (
    <div>
      <h2>项目列表</h2>
      {projects.map(project => (
        <div key={project.id} className="project-item">
          <h3>项目名称:{project.name}</h3>
          <p>项目描述:{project.desc}</p>
          <div className="resident-list">
            <h4>参与居民:</h4>
            {/* 直接从映射表取数据,无需每次循环过滤 */}
            {(projectResidentMap.get(project.id) || []).map(resident => (
              <span key={resident.id} className="resident-tag">
                {resident.name}
              </span>
            ))}
          </div>
        </div>
      ))}
    </div>
  )
}
  • 两种方案的关联逻辑都可以根据你实际的字段名调整,只要修改匹配条件即可
  • 如果两个数组没有明确的关联字段,需要先确认关联规则后再调整匹配逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:24:04