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

React.js中按user_id为列表项分配交替颜色的实现需求

问题描述

我有如下对象数组:

let objects = [
{
    id: 1,
    user_id: 2
},
{
    id: 2,
    user_id: 2
},
{
    id: 3,
    user_id: 3
},
{
    id: 4,
    user_id: 4
},
{
    id: 5,
    user_id: 4
},
{
    id: 6,
    user_id: 5
},
{
    id: 7,
    user_id: 4
},
];

需要在React的JSX中遍历该数组,为每个元素分配红色或蓝色,规则如下:

  • 相同user_id的元素使用同一种颜色
  • 同一user_id后续出现的元素组需切换颜色

示例效果:

  • user_id=2的前两个元素:蓝色
  • user_id=3的id=3:红色
  • user_id=4的id=4、5:蓝色
  • user_id=5的id=6:红色
  • user_id=4的id=7:蓝色

我当前的代码片段:

{objects.map((x, i) => (
    <> {objects[i-1] !== undefined && objects[i+1] !== undefined && objects[i].user_id !== objects[i-1].user_id && objects[i].user_id !== objects[i+1].user_id } </>
))}
解决方案

要实现这个需求,关键是先把连续相同user_id的元素划分为独立分组,再为每个分组分配颜色——同时要跟踪每个user_id上次使用的颜色,当该user_id的新组出现时自动切换颜色。

1. 预处理数组,生成带颜色的分组

先写个工具函数,遍历原数组完成分组和颜色分配:

const getColoredGroups = (arr) => {
  if (!arr.length) return [];
  const userColorHistory = new Map(); // 记录每个user_id最后使用的颜色
  const groups = [];
  let currentGroup = [arr[0]];
  let currentUserId = arr[0].user_id;

  for (let i = 1; i < arr.length; i++) {
    const item = arr[i];
    if (item.user_id === currentUserId) {
      currentGroup.push(item);
    } else {
      // 为当前组分配颜色:如果该user_id之前用了蓝色,这次换红色,反之用蓝色
      const lastColor = userColorHistory.get(currentUserId);
      const groupColor = lastColor === 'blue' ? 'red' : 'blue';
      groups.push({ items: currentGroup, color: groupColor });
      // 更新该user_id的颜色记录
      userColorHistory.set(currentUserId, groupColor);
      // 开启新的分组
      currentGroup = [item];
      currentUserId = item.user_id;
    }
  }
  // 处理最后一组元素
  const lastColor = userColorHistory.get(currentUserId);
  const groupColor = lastColor === 'blue' ? 'red' : 'blue';
  groups.push({ items: currentGroup, color: groupColor });
  userColorHistory.set(currentUserId, groupColor);

  return groups;
};

// 在React组件中调用该函数
const coloredGroups = getColoredGroups(objects);

2. 在JSX中渲染元素

遍历处理好的分组,给每个元素应用对应颜色:

return (
  <div>
    {coloredGroups.map((group, groupIndex) => (
      <div key={`group-${groupIndex}`}>
        {group.items.map(item => (
          <div 
            key={item.id} 
            style={{ color: group.color, margin: '4px 0' }}
          >
            ID: {item.id},用户ID: {item.user_id}
          </div>
        ))}
      </div>
    ))}
  </div>
);

补充说明

  • userColorHistory这个Map用来存储每个user_id的颜色使用记录,确保同一user_id的下一个分组自动切换颜色
  • 分组仅针对连续相同的user_id,非连续的同user_id会被视为新分组
  • 如果你想用CSS类名而非行内样式,只需把style替换为className,比如className={group.color === 'blue' ? 'blue-text' : 'red-text'},然后在样式表中定义对应的颜色样式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:32:51