如何找到序列数组最后一个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
相关产品推荐
相关产品推荐

