- concat 2 arrays
- filter array
- test all / any array elements
Caution, there's no compiler validation on argument types or array dimensions. Javascript can generate some hybrid results
Code: Select all
Prototype.i _CompareElements(*Element1, *Element2)
Prototype.i _KeepElement(*Element)
Prototype.i _TestElement(*Element, Index, *Array)
Procedure SortArrayByComparison(*ArrayToSort, *Function._CompareElements)
!p_ArrayToSort.array.sort(p_Function);
EndProcedure
Procedure.i FilterArray(*ArrayToFilter, *Function._KeepElement, *ResultArray=#Null)
If Not *ResultArray : *ResultArray=*ArrayToFilter : EndIf
;update array data
!var filteredArray=p_ArrayToFilter.array.filter(p_Function),
! filteredLength=filteredArray.length-1
!p_ResultArray.array=filteredArray
;update array size
!spider_ReDim(p_ResultArray,(filteredLength<0)?0:filteredLength);
;retrieves result array size (-1 means empty result)
!return filteredLength;
EndProcedure
Procedure.i ConcatArrays(*Array1, *Array2, *ResultArray)
!p_ResultArray.array=p_Array1.array.concat(p_Array2.array);
!p_ResultArray.dimensions[0]=p_ResultArray.array.length-1;
;retrieves result array size
!return p_ResultArray.array.length-1;
EndProcedure
Procedure.i TestArray(*ArrayToTest, *Function._TestElement, Flag=0)
Select Flag
Case #PB_All
!return p_ArrayToTest.array.every(p_Function);
Default
!return p_ArrayToTest.array.some(p_Function);
EndSelect
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
; *************************
; EXAMPLE
; *************************
Structure MY_TYPE
text.s
value.i
EndStructure
Procedure.i CompareValues(*a.MY_TYPE,*b.MY_TYPE)
;ProcedureReturn (*b\value-*a\value) ;value descending
ProcedureReturn (*a\value-*b\value) ;value ascending
EndProcedure
Procedure.i CompareStringsValues(*a.MY_TYPE,*b.MY_TYPE)
If *a\text<>*b\text
ProcedureReturn 1-2*Bool(*a\text<*b\text) ;string ascending
Else
ProcedureReturn (*a\value-*b\value) ;value ascending
EndIf
EndProcedure
Procedure.i KeepValueBeginsWith11(*a.MY_TYPE)
ProcedureReturn Bool(Mid(""+*a\value,1,2)="11") ;keep element if TRUE
EndProcedure
Procedure.i ValueGreaterThan50(*a.MY_TYPE, Index, *Array)
ProcedureReturn Bool(*a\value>50)
EndProcedure
Dim firstArr.MY_TYPE(9)
Dim secondArr.MY_TYPE(9)
Dim resultArr.MY_TYPE(0)
For i=0 To ArraySize(firstArr())
firstArr(i)\value=100+Random(10)
firstArr(i)\text=Chr('a'+Random(10))
Next
For i=0 To ArraySize(secondArr())
secondArr(i)\value=Random(10)
secondArr(i)\text=Chr('a'+Random(25, 10))
Next
Debug #LF$+"Concat two arrays..."
concatLength=ConcatArrays(firstArr(),secondArr(),resultArr())
For i=0 To concatLength
Debug "concatenated: "+resultArr(i)\text+" "+resultArr(i)\value
Next
Debug #LF$+"Sort by value..."
SortArrayByComparison(resultArr(),@CompareValues())
For i=0 To ArraySize(resultArr())
Debug "sorted: "+resultArr(i)\value+" "+resultArr(i)\text
Next
Debug #LF$+"Sort by string and value..."
SortArrayByComparison(resultArr(),@CompareStringsValues())
For i=0 To ArraySize(resultArr())
Debug "sorted: "+resultArr(i)\text+" "+resultArr(i)\value
Next
Debug #LF$+"Test array elements..."
If TestArray(resultArr(),@ValueGreaterThan10(),#PB_All)
Debug "All values are greater than 50."
EndIf
If TestArray(resultArr(),@ValueGreaterThan50())
Debug "At least one of the values is greater than 50."
EndIf
Debug #LF$+"Filter values begin with 11..."
filterLength=FilterArray(resultArr(),@KeepValueBeginsWith11())
For i=0 To filterLength
Debug "filtered: "+resultArr(i)\text+" "+resultArr(i)\value
Next
CompilerEndIf