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

Pine Script两数组对比删公共值后拼接 循环索引越界问题求解

问题原因
  • 数组引用传递错误:直接使用c = e、d = f赋值时,Pine Script中数组为引用类型,c和e会指向同一块内存地址,修改c时原输入数组e也会被同步修改,且你没有拷贝数组,后续删除操作直接改变了数组实际长度。
  • 循环边界固定:for循环的终止值array.size(e)-1是循环开始前就计算完成的固定值,不会跟随数组删除元素后的长度动态更新,当数组实际长度缩小后,i的取值会超过当前数组的最大索引,触发越界报错。
  • 删除索引逻辑错误:匹配到array.get(e,i) == array.get(f,j)时,错误删除d数组的i位置元素,应该删除d数组的j位置元素;且正序遍历中删除元素后,后续元素的索引会整体前移1位,会跳过下一个元素的比对,也容易触发越界。
可行实现方案

我们采用反向遍历索引的方案避免删除元素导致的索引错乱,同时先拷贝原数组避免修改原始输入:

//@version=4
study("array.concat 去重拼接")
a = array.new_float(0)
b = array.new_float(0)
array.push(a, 0)
array.push(a, 1)
array.push(a, 2)
array.push(a, 4)

array.push(b, 0)
array.push(b, 1)
array.push(b, 3)
array.push(b, 4)

disjoint(e,f)=>
    // 先拷贝输入数组,避免修改原数组
    c = array.new_float(0)
    array.concat(c, e)
    d = array.new_float(0)
    array.concat(d, f)
    // 反向遍历c的索引,从最后一位到第一位,删除元素不影响未遍历的索引
    for i = array.size(c) - 1 down to 0
        val_c = array.get(c, i)
        // 反向遍历d的索引
        for j = array.size(d) - 1 down to 0
            val_d = array.get(d, j)
            if val_c == val_d
                array.remove(c, i)
                array.remove(d, j)
                break // 匹配到后退出内层循环,避免重复删除
    // 拼接处理后的两个数组
    res = array.new_float(0)
    array.concat(res, c)
    array.concat(res, d)
    res

z = disjoint(a,b)

if barstate.islast
    l1 = label.new(bar_index, 0, "AFTER\na: " + tostring(a) + "\nb: " + tostring(b) + "\nZ: " + tostring(z), style = label.style_label_up, size = size.normal)
    label.delete(l1[1]) 

运行结果

测试用例下输出结果:

  • 原数组a:[0,1,2,4],原数组b:[0,1,3,4]
  • 处理后拼接的z:[2,3],符合预期要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:54:04