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

React中点击按钮将更新后的数组项移至开头有什么更优实现方案?

优化实现方案

1. 简洁可读版(O(n)时间复杂度,适合绝大多数中小数据量场景)

const completeTaskHandler = (idValue) => {
  setData((prevData) => {
    // 不可变更新目标项的completed状态,避免修改原状态对象
    const targetTask = prevData.find(item => item.id === idValue)
    const updatedTask = { ...targetTask, completed: true }
    // 直接将更新后的任务项放在头部,剩余项过滤掉原目标项后拼接在后面
    return [updatedTask, ...prevData.filter(item => item.id !== idValue)]
  })
}

这个方案比原实现少一次数组遍历,同时遵守React状态不可变更新原则,避免直接修改原状态对象引发的潜在渲染异常。

2. 高性能版(仅遍历一次数组,适合千条以上大数据量场景)

const completeTaskHandler = (idValue) => {
  setData((prevData) => {
    return prevData.reduce((result, current) => {
      if (current.id === idValue) {
        // 匹配到目标项时,更新后插入结果数组头部
        result.unshift({ ...current, completed: true })
      } else {
        // 其余项直接追加到结果数组尾部
        result.push(current)
      }
      return result
    }, [])
  })
}

扩展需求适配:所有已完成任务统一排在最前面

如果你的需求是所有已完成任务都排在数组头部,未完成任务在尾部,同时刚标记完成的任务排在已完成列表的最前位置,可以用以下实现:

const completeTaskHandler = (idValue) => {
  setData((prevData) => {
    // 先更新目标项状态
    const updatedList = prevData.map(item => 
      item.id === idValue ? { ...item, completed: true } : item
    )
    // 排序:已完成项优先,同状态保持原有相对顺序
    return updatedList.sort((a, b) => b.completed - a.completed)
  })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 23:42:01