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> } []
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
}
}
]