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

如何移除数组中存在于另一数组的值及解决数组越界错误

问题分析与解决方案

错误原因

报错'array.get()'函数中,索引46超出范围,数组大小为45的核心原因是正向循环删除数组元素时,数组长度动态缩短导致索引越界:

  • 在for i = 0 to ...的正向循环中调用numbersWHOLE.remove(i)时,数组长度会立即减1,后续元素向前移位。
  • 循环仍按初始数组长度递增i,当i超过删除元素后的数组最大索引时,就会触发索引越界错误。

修复方案

更高效且安全的方式是直接构建新数组,只保留不在目标排除数组中的元素,避免循环删除的索引错乱问题,同时完成「从numbersWHOLE/numbersHALF中移除存在于numbersBIG/numbersBIGhalf的值」的需求:

完整修复代码

//@version=5
indicator("snippet", overlay=true, max_lines_count = 500, max_bars_back = 500)

TRange = 1.2700
BRange =  1.2205
ArrFreq = 100*syminfo.mintick
BRange00 = 1.2200
bigArrFreq = 1000*syminfo.mintick
BRangeBigHALF = 1.2250

var numbersWHOLE=array.new_float(0)
var numbersHALF=array.new_float(0)
var numbersBIG=array.new_float(0)
var numbersBIGhalf=array.new_float(0)

if barstate.islast and timeframe.isintraday
    // 重置数组,避免重复累加元素
    array.clear(numbersBIG)
    array.clear(numbersBIGhalf)
    array.clear(numbersHALF)
    array.clear(numbersWHOLE)
    
    // 填充基础数组
    for i = BRange00 to TRange by bigArrFreq
        array.push(numbersBIG,i)
    for i = BRangeBigHALF to TRange by bigArrFreq
        array.push(numbersBIGhalf,i)
    for i = BRange to TRange by ArrFreq
        array.push(numbersHALF,i)
    for i = BRange00 to TRange by ArrFreq
        array.push(numbersWHOLE,i)

    // 筛选numbersWHOLE:移除存在于numbersBIG的元素
    var tempWHOLE = array.new_float(0)
    array.clear(tempWHOLE)
    for val in numbersWHOLE
        if not numbersBIG.includes(val)
            array.push(tempWHOLE, val)
    array.clear(numbersWHOLE)
    array.push(numbersWHOLE, tempWHOLE)

    // 筛选numbersHALF:移除存在于numbersBIGhalf的元素
    var tempHALF = array.new_float(0)
    array.clear(tempHALF)
    for val in numbersHALF
        if not numbersBIGhalf.includes(val)
            array.push(tempHALF, val)
    array.clear(numbersHALF)
    array.push(numbersHALF, tempHALF)

    // 绘制线条逻辑保持不变
    for i = 0 to array.size(numbersHALF) - 1        
        line.new(bar_index - 20, array.get(numbersHALF,i),bar_index + 20,  array.get(numbersHALF,i), style = line.style_dashed, color = color.red, width = 1)
    for i = 0 to array.size(numbersWHOLE) - 1        
        line.new(bar_index - 20, array.get(numbersWHOLE,i),bar_index + 20,  array.get(numbersWHOLE,i), style = line.style_dashed, color = color.red, width = 1)
    
    for i = 0 to array.size(numbersBIGhalf) - 1
        line.new(bar_index - 400, array.get(numbersBIGhalf,i),bar_index + 100,  array.get(numbersBIGhalf,i), style = line.style_dashed, color = color.white, width = 1, extend = extend.both)
    for i = 0 to array.size(numbersBIG) - 1
        line.new(bar_index - 400, array.get(numbersBIG,i),bar_index + 100,  array.get(numbersBIG,i), style = line.style_dashed, color = color.white, width = 1, extend = extend.both)

关键优化点

  1. 数组重置:每次barstate.islast触发时清空所有数组,避免多次执行时元素重复累加。
  2. 筛选式构建新数组:用for val in ...遍历原数组,将符合条件的元素存入临时数组后替换原数组,彻底规避索引越界问题。
  3. 明确排除逻辑:分别处理两组数组的排除关系,完全匹配需求。

内容的提问来源于stack exchange,提问作者Vilém Ivanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:35:19