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

React条件渲染中如何让重复的partOfSpeech词性仅渲染一次?

实现思路

  • 先对所有释义按词性的字母顺序排序
  • 用reduce方法按词性分组,相同词性的释义聚合到同一个数组中
  • 渲染时先遍历词性分组,每组仅输出1次词性标题,再遍历该分组下的所有释义生成列表项,避免词性重复展示

完整代码示例

import React from 'react';

// 你的组件内部逻辑
const DefinitionList = (props) => {
  // 1. 先按词性排序再分组
  const groupedDefinitions = props.data.definitions
    .sort((a, b) => a.partOfSpeech.localeCompare(b.partOfSpeech))
    .reduce((acc, currentDef) => {
      const pos = currentDef.partOfSpeech;
      // 该词性首次出现时初始化空数组
      if (!acc[pos]) {
        acc[pos] = [];
      }
      // 将当前释义推入对应词性分组,如需保留其他字段可直接push(currentDef)
      acc[pos].push(currentDef.definition);
      return acc;
    }, {});

  // 2. 把分组对象转为数组方便遍历,顺序已保持字母序
  const definitionGroups = Object.entries(groupedDefinitions);

  return (
    <ol className={classes.ol}>
      {definitionGroups.map(([partOfSpeech, definitions], groupIndex) => (
        // 带key的Fragment不能用<>短语法
        <React.Fragment key={groupIndex}>
          {/* 每个分组仅展示一次词性标题 */}
          <h3>{partOfSpeech}</h3>
          {/* 遍历当前词性下所有释义 */}
          {definitions.map((definition, defIndex) => (
            <li 
              key={`pos-${groupIndex}-def-${defIndex}`} 
              className={classes.list}
            >
              {definition.charAt(0).toUpperCase() + definition.slice(1)} ({partOfSpeech})
            </li>
          ))}
        </React.Fragment>
      ))}
    </ol>
  );
};

说明

  • 如果你的definition对象还包含例句、音标等其他属性,reduce阶段直接存入完整currentDef对象即可,后续渲染时按需取对应属性。
  • 生产环境建议替换示例中的索引为唯一业务ID作为key值,避免列表重渲染时出现异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:18:04