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

如何基于距离数组对API数据排序并渲染React卡片组件?

问题:按距离由近到远排序并渲染卡片列表

我已从API获取数据data及距离数组distance,该数组存储了地图上每个数据对象与我点击点位之间的计算距离。请问如何将这些对象按距离由近到远排序,并据此渲染卡片列表?

数据示例

data = [{id: 20, name: 'Yoda', height: 0.66, mass: 13, gender: 'male', …}, ...]
distance = [15277.712059994128, 9096.467900013797, 2693.8381772957678, ...]

当前组件代码

CardList组件

const CardList = ({ data, distance }) => {
  return (
    <div className='card-list'>
      <div className='card-list_container'>
        {data.map((hero) => {
          return <Card key={hero.id} id={hero.id} distance={distance} />;
        })}
      </div>
    </div>
  );
};

export default CardList;

Card组件

const Card = ({ id, distance }) => {
  const data = useHeroData({ id });
 return (
    <div className='card'>
      <div className='card-container'> 
          <p className='hero-stats'>
                <span className='hero-stats_tag'>Mass:</span> {data.mass} kg
              </p>
              <p className='hero-stats'>
                {' '}
                <span className='hero-stats_tag'>Distance:</span>
                {Math.ceil(data.distance)} Km
              </p>
            </div>
    </div>
 );
};

解决方案

1. 关联数据与对应距离

假设data和distance的索引一一对应(即data[0]对应distance[0]),先把每个英雄数据和对应的距离绑定:

const combinedData = data.map((item, index) => ({
  ...item,
  distance: distance[index]
}));

2. 按距离升序排序

对组合后的数组按距离由近到远排序,注意用扩展运算符避免修改原数据:

const sortedData = [...combinedData].sort((a, b) => a.distance - b.distance);

3. 修改CardList组件渲染排序后的数据

更新CardList组件,完成数据组合排序后再渲染卡片,同时优化参数传递:

const CardList = ({ data, distance }) => {
  // 组合数据并排序
  const sortedHeroes = data
    .map((hero, index) => ({ ...hero, distance: distance[index] }))
    .sort((a, b) => a.distance - b.distance);

  return (
    <div className='card-list'>
      <div className='card-list_container'>
        {sortedHeroes.map((hero) => (
          <Card key={hero.id} hero={hero} />
        ))}
      </div>
    </div>
  );
};

export default CardList;

4. 调整Card组件接收数据

直接接收完整的英雄对象,避免重复获取数据:

const Card = ({ hero }) => {
 return (
    <div className='card'>
      <div className='card-container'> 
          <p className='hero-stats'>
                <span className='hero-stats_tag'>Mass:</span> {hero.mass} kg
              </p>
              <p className='hero-stats'>
                <span className='hero-stats_tag'>Distance:</span>
                {Math.ceil(hero.distance)} Km
              </p>
            </div>
    </div>
 );
};

备选方案(保留useHeroData的情况)

如果必须通过useHeroData获取数据,可调整为传递对应距离值:

// CardList中传递对应距离
{sortedHeroes.map((hero) => (
  <Card key={hero.id} id={hero.id} distance={hero.distance} />
))}

// Card组件中使用传入的distance
const Card = ({ id, distance }) => {
  const data = useHeroData({ id });
 return (
    <div className='card'>
      <div className='card-container'> 
          <p className='hero-stats'>
                <span className='hero-stats_tag'>Mass:</span> {data.mass} kg
              </p>
              <p className='hero-stats'>
                <span className='hero-stats_tag'>Distance:</span>
                {Math.ceil(distance)} Km
              </p>
            </div>
    </div>
 );
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:31:12