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

JavaScript循环按峰值位置切分数组功能异常问题求助

现有代码问题梳理

  • 条件判断误用赋值运算符:if (test_flag = true) 使用了单等号=,属于赋值操作而非相等判断,每次执行这段代码都会强制把test_flag设为true,导致初始化逻辑(给peak、arr赋初始值)每次都触发,状态无法往下传递。
  • 赋值操作误用比较运算符:test_flag == false 使用了双等号==,属于相等比较而非赋值,test_flag永远不会被修改为false,进一步导致初始化逻辑反复执行。
  • 状态变量作用域问题:如果把arr、peak、test_flag写在点击事件处理函数内部,每次点击都会重新初始化变量,无法保留上一轮切割后的数组和峰值位置。
  • 缺少无峰值的终止判断:如果find_the_peaks返回空值/无效值时没有终止逻辑,会导致后续切割报错。

调整后实现方案

首先将状态变量定义在点击事件的外部作用域,避免每次点击重置状态,再修正运算符错误、增加终止判断即可,参考实现如下:

// 状态变量定义在点击事件外部,可根据实际场景放在全局或者组件作用域
let test_flag = true;
let peak = 0;
let arr = [];
const initArr = [6,2,6,8,3,2,6,8,9,2,26,8,2,1,6,9,3,4,7,9,8,1,9,2];

// 点击事件处理函数
function handleClick() {
    // 初始化逻辑仅首次执行,用===做严格相等判断
    if (test_flag === true) {
        peak = 9;
        arr = initArr;
        // 初始化完成后修改标记,后续不再触发
        test_flag = false;
    }
    // 基于当前峰值位置切割数组
    arr = arr.slice(peak);
    // 获取新的峰值位置
    const newPeak = find_the_peaks(arr);
    // 无有效峰值时终止流程
    if ([null, undefined].includes(newPeak) || newPeak < 0 || newPeak >= arr.length) {
        console.log('已无剩余峰值,流程终止');
        return;
    }
    // 更新峰值为下一轮切割的切点
    peak = newPeak;
    console.log('当前切割后数组:', arr);
}

如果你的find_the_peaks返回的是初始数组的绝对索引,而非切割后新数组的相对索引,只需要额外增加一个偏移量变量记录累计切割的长度,将返回的绝对索引减去偏移量得到相对索引再使用即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 03:06:10