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

如何找到序列数组最后一个completed为true的对象并设置下下个对象is_to_happen属性

实现流程节点is_to_happen属性赋值需求

原代码问题分析

你之前的reduce实现存在两个核心问题:

  • 逻辑错误:每次遍历到completed为true的对象就重复往结果数组插入元素,会导致最终数组长度翻倍,完全不符合要求
  • 未满足核心需求:没有先定位最后一个completed为true的节点位置,也没有计算该节点往后第二个节点的下标

正确实现思路

  • 第一步:先定位最后一个completed属性为true的对象的下标
  • 第二步:计算目标节点下标 = 最后一个已完成节点下标 + 2
  • 第三步:遍历数组为每个节点添加is_to_happen属性,仅当下标等于目标下标且下标在数组合法范围内时赋值为true,其余均为false

代码实现

常规易读版本

function processSequences(sequences) {
  // 倒序查找最后一个completed为true的下标
  let lastCompletedIndex = -1
  for (let i = sequences.length - 1; i >= 0; i--) {
    if (sequences[i].completed) {
      lastCompletedIndex = i
      break
    }
  }
  const targetIndex = lastCompletedIndex + 2
  // 生成新数组,浅拷贝原对象避免修改原数据
  return sequences.map((item, index) => ({
    ...item,
    is_to_happen: index === targetIndex
  }))
}

// 测试你的示例输入
const sequences = [
    {
        "title": "Order placed",
        "completed": true
    },
    {
        "title": "To be confirmed",
        "completed": false
    },
    {
        "title": "Approx Thursday product will be shipped",
        "completed": false
    }
]
console.log(processSequences(sequences)) // 输出和你给的期望结果完全一致

reduce实现版本

如果你一定要用reduce实现,可以按以下方式写:

function processSequencesByReduce(sequences) {
  // 第一次reduce查找最后一个completed为true的下标
  const lastCompletedIndex = sequences.reduce((acc, curr, index) => {
    return curr.completed ? index : acc
  }, -1)
  const targetIndex = lastCompletedIndex + 2
  // 第二次reduce生成结果数组
  return sequences.reduce((acc, curr, index) => {
    acc.push({
      ...curr,
      is_to_happen: index === targetIndex
    })
    return acc
  }, [])
}

边界情况说明

  • 如果没有任何completed: true的节点,所有节点的is_to_happen均为false
  • 如果最后一个已完成节点往后数第二个节点超出数组长度范围,所有节点的is_to_happen均为false

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:06:01