获取数组中数值的区间范围

302 阅读1分钟
export const getArrayLength = (data: Array<any>) => data.length

type RangeOriginData<T> = T []
type RangeFindCallback<T> = (value: T, index?: number, thisArg?: RangeOriginData<T>) => boolean
type CatchPoll<T> = { index: number, value: T }
type RangeData <T> = { startIndex: CatchPoll<T>, endIndex: CatchPoll<T> } []

/** 
 * * 获取数组中数值区间 
 * * return [ 
 * *   {  
 * *     startIndex: { index: number, value: T }, endIndex: { index: number, value: T } 
 * *   }
 * * ] 
*/
export function rangeFind <T>(rangeOriginData: RangeOriginData<T>, rangeCallback: RangeFindCallback<T>): RangeData <T> | Error {


    const rangeData: RangeData<T> = []

    const catchPoll: CatchPoll<T> [] = []

    if (Array.isArray(rangeOriginData)) {

        for (let index = 0; index < rangeOriginData.length; index++) {
    
            const element = rangeOriginData[ index ]
    
            if (rangeCallback(element, index, rangeOriginData)) {
    
                catchPoll.push({ index, value: element  })
    
            } else {
    
                createRangenNode(catchPoll, rangeData)
                
                catchPoll.length = 0
    
            }
        }
    
        createRangenNode(catchPoll, rangeData)
                
        catchPoll.length = 0
    }


    return rangeData

}

/**
 * 生成区间范围节点数据
*/
function createRangenNode <T>(catchPoll: CatchPoll<T> [], rangeData: RangeData<T> ): void {

    if (catchPoll.length) {
        const length = getArrayLength(catchPoll) - 1
        rangeData.push({
            startIndex: catchPoll[0],
            endIndex: catchPoll[length]
        })
    }

}


const data = [ 1,2,3,4,5,6,7,1,1,1,1,5,6,7,1,2,3,4,1 ]
const markLine = rangeFind(data, (item) => {
    return item > 3
})
输出 :=====》
[
    {
        "startIndex": {
            "index": 3,
            "value": 4
        },
        "endIndex": {
            "index": 6,
            "value": 7
        }
    },
    {
        "startIndex": {
            "index": 11,
            "value": 5
        },
        "endIndex": {
            "index": 13,
            "value": 7
        }
    },
    {
        "startIndex": {
            "index": 17,
            "value": 4
        },
        "endIndex": {
            "index": 17,
            "value": 4
        }
    }
]