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

React中如何渲染复杂数据数组?如何按餐厅分组渲染订单至DOM

在React中按餐厅分组渲染订单数组

嘿,这个需求其实分两步走就很清晰啦——先把你的订单数据按餐厅名称分组,再把分组后的结果渲染到DOM里就行。我给你一步步拆解:

第一步:按餐厅名称分组数据

首先,咱们需要把原始的平级订单数组转换成以餐厅名称为键、对应订单数组为值的对象。这里用JavaScript的reduce方法就能轻松实现:

const rawOrders = [
  { "_id": "5c6468c77982450218a95acf", "name": "Restaurant0", "location": "Tokio", "workinghours": 18, "user": "asa", "foodName": "Apple Pie", "orderDate": "25.02.2019.", "__v": 0 },
  { "_id": "5c6468c77982450218a95acf", "name": "Restaurant0", "location": "Tokio", "workinghours": 18, "user": "asa", "foodName": "Apple", "orderDate": "25.02.2019.", "__v": 0 },
  { "_id": "5c6468c77982450218a95acf", "name": "Restaurant1", "location": "Tokio", "workinghours": 18, "user": "asa", "foodName": "Apple Pie", "orderDate": "25.02.2019.", "__v": 0 },
  { "_id": "5c6468c77982450218a95acf", "name": "Restaurant1", "location": "Tokio", "workinghours": 18, "user": "asa", "foodName": "Fish sendvich", "orderDate": "25.02.2019.", "__v": 0 },
];

// 按餐厅名称分组
const groupedOrders = rawOrders.reduce((acc, order) => {
  // 如果当前餐厅还未在分组对象中,初始化一个空数组
  if (!acc[order.name]) {
    acc[order.name] = [];
  }
  // 将当前订单推入对应餐厅的数组
  acc[order.name].push(order);
  return acc;
}, {});

这段代码执行后,groupedOrders的结构会变成这样:

{
  "Restaurant0": [/* 该餐厅的两个订单 */],
  "Restaurant1": [/* 该餐厅的两个订单 */]
}

第二步:在React组件中渲染分组后的数据

接下来咱们写一个React组件,把分组好的数据渲染成DOM结构。核心思路是遍历所有餐厅名称,再逐个渲染对应餐厅的订单列表:

import React from 'react';

const RestaurantOrderList = ({ orders }) => {
  // 第一步:分组数据
  const groupedOrders = orders.reduce((acc, order) => {
    if (!acc[order.name]) {
      acc[order.name] = [];
    }
    acc[order.name].push(order);
    return acc;
  }, {});

  // 获取所有餐厅名称的数组,用于遍历渲染
  const restaurantNames = Object.keys(groupedOrders);

  return (
    <div className="restaurant-order-container">
      {restaurantNames.map(restaurantName => (
        <div key={restaurantName} className="restaurant-section">
          {/* 餐厅标题 */}
          <h2>{restaurantName}</h2>
          {/* 订单列表 */}
          <ul className="order-list">
            {groupedOrders[restaurantName].map(order => (
              <li key={`${order._id}-${order.foodName}`} className="order-item">
                <p><strong>餐品:</strong>{order.foodName}</p>
                <p><strong>下单用户:</strong>{order.user}</p>
                <p><strong>下单日期:</strong>{order.orderDate}</p>
                {/* 可根据需求添加其他字段,比如餐厅位置、营业时间 */}
              </li>
            ))}
          </ul>
        </div>
      ))}
    </div>
  );
};

// 使用组件时传入原始订单数组
export default RestaurantOrderList;

几个关键细节提醒:

  • Key的设置:注意给每个map生成的元素添加唯一key。你的示例数据中_id是重复的,所以我用了${order._id}-${order.foodName}作为订单项的key,确保唯一性。如果实际数据中_id是唯一的,直接用order._id即可。
  • 异步数据处理:如果你的订单数据是从API获取的,记得添加加载状态和错误处理:
    const RestaurantOrderList = () => {
      const [orders, setOrders] = React.useState([]);
      const [loading, setLoading] = React.useState(true);
      const [error, setError] = React.useState(null);
    
      React.useEffect(() => {
        fetch('/your-api-url')
          .then(res => res.json())
          .then(data => {
            setOrders(data);
            setLoading(false);
          })
          .catch(err => {
            setError('加载订单失败,请稍后重试');
            setLoading(false);
          });
      }, []);
    
      if (loading) return <div>加载中...</div>;
      if (error) return <div className="error">{error}</div>;
    
      // 后续分组和渲染逻辑不变
      const groupedOrders = orders.reduce(/* ... */);
      // ...
    };
    

这样就能实现每个餐厅展示专属订单列表的需求啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:13:41