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

Pine Script取两个数组唯一值时出现index 30越界错误如何解决

错误原因排查

    1. 数组引用赋值问题:Pine Script中数组属于引用类型,你写c = e、d = f并没有复制出两个新数组,只是给原数组e、f起了别名,对c、d的修改会直接改变原数组e、f的内容,导致外层循环的array.size(e)动态变小,但你循环的终止条件是初始计算的array.size(e)-1,后续i的取值会超过当前数组的实际长度,触发越界错误。
    1. 索引逻辑错误:你匹配到的是数组e的i下标元素和数组f的j下标元素相等,但删除d(也就是f的别名)时用了i作为下标,完全不符合实际匹配位置,会误删元素。
    1. 循环逻辑错误:在遍历数组的过程中删除元素,会导致后续元素的下标集体前移,如果不调整循环变量的步长,会跳过部分元素,同时也会加剧下标越界的概率。

修正方案

你的需求是获取两个数组的对称差集(即仅在其中一个数组中出现、没有同时出现在两个数组里的元素),修正后的代码如下:

// 深拷贝数组避免修改原数组
array_copy(arr)=>
    new_arr = array.new_float()
    for i = 0 to array.size(arr) - 1
        array.push(new_arr, array.get(arr, i))
    new_arr

// 检查元素是否存在于数组中
array_contains(arr, val)=>
    res = false
    for i = 0 to array.size(arr) - 1
        if array.get(arr, i) == val
            res = true
            break
    res

// 求两个数组的对称差集
disjoint(e, f)=>
    // 先复制两个原数组,避免修改原数据
    c = array_copy(e)
    d = array_copy(f)
    res = array.new_float()
    // 遍历第一个数组,收集不在第二个数组里的元素
    for i = 0 to array.size(c) - 1
        val = array.get(c, i)
        if not array_contains(d, val)
            array.push(res, val)
    // 遍历第二个数组,收集不在第一个数组里的元素
    for i = 0 to array.size(d) - 1
        val = array.get(d, i)
        if not array_contains(c, val)
            array.push(res, val)
    res

// 调用示例
final_array = disjoint(array1, array2)

优化说明

  • 新增array_copy工具函数深拷贝数组,不会修改传入的原始数组
  • 新增array_contains工具函数简化存在性判断逻辑,避免嵌套循环过程中删除元素导致的索引混乱
  • 整个过程不需要在遍历数组时删除元素,从根源上避免了下标越界问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:39:01