@@ -32,7 +32,8 @@ export interface IFilterCondition<V> {
3232 * @param {options } options 支持定制子元素名称、反向遍历、广度优先遍历,默认{
3333 childField: 'children',
3434 reverse: false,
35- breadthFirst: false
35+ breadthFirst: false,
36+ isDomNode: false,
3637 }
3738 * @returns {* }
3839 */
@@ -45,7 +46,7 @@ export function forEachDeep<V>(
4546 tree : ArrayLike < V > ,
4647 parent : V | null ,
4748 level : number
48- ) => boolean | void ,
49+ ) => boolean | undefined ,
4950 options : { childField ?: string ; reverse ?: boolean ; breadthFirst ?: boolean ; isDomNode ?: boolean } = {
5051 childField : 'children' ,
5152 reverse : false ,
@@ -68,92 +69,88 @@ export function forEachDeep<V>(
6869 parent : V | null ;
6970 level : number ;
7071 } [ ] = [ ] ;
71- const walk = ( arr : ArrayLike < V > , parent : V | null , level = 0 ) => {
72- if ( reverse ) {
73- for ( let index = arr . length - 1 ; index >= 0 ; index -- ) {
74- if ( isBreak ) {
72+ const reverseWalk = ( arr : ArrayLike < V > , parent : V | null , level = 0 ) => {
73+ for ( let index = arr . length - 1 ; index >= 0 ; index -- ) {
74+ if ( isBreak ) {
75+ break ;
76+ }
77+ const item = arr [ index ] ;
78+ // 广度优先
79+ if ( breadthFirst ) {
80+ queue . push ( { item, index, array : arr , tree, parent, level } ) ;
81+ } else {
82+ const re = iterator ( item , index , arr , tree , parent , level ) ;
83+ if ( re === false ) {
84+ isBreak = true ;
7585 break ;
86+ } else if ( re === true ) {
87+ continue ;
7688 }
77- const item = arr [ index ] ;
78- // 广度优先
79- if ( breadthFirst ) {
80- queue . push ( { item, index, array : arr , tree, parent, level } ) ;
81- } else {
82- const re = iterator ( item , index , arr , tree , parent , level ) ;
83- if ( re === false ) {
84- isBreak = true ;
85- break ;
86- } else if ( re === true ) {
87- continue ;
88- }
89- if ( item && ( isDomNode ? isNodeList ( item [ childField ] ) : Array . isArray ( item [ childField ] ) ) ) {
90- walk ( item [ childField ] , item , level + 1 ) ;
91- }
89+ if ( item && ( isDomNode ? isNodeList ( item [ childField ] ) : Array . isArray ( item [ childField ] ) ) ) {
90+ reverseWalk ( item [ childField ] , item , level + 1 ) ;
9291 }
9392 }
94- if ( breadthFirst ) {
95- // Process queue
96- while ( queue . length > 0 && ! isBreak ) {
97- const current = queue . shift ( ) ;
98- const { item, index, array, tree, parent, level } = current ! ;
99- const re = iterator ( item , index , array , tree , parent , level ) ;
100- if ( re === false ) {
101- isBreak = true ;
102- break ;
103- } else if ( re === true ) {
104- continue ;
105- }
106-
107- if ( item && ( isDomNode ? isNodeList ( item [ childField ] ) : Array . isArray ( item [ childField ] ) ) ) {
108- walk ( item [ childField ] , item , level + 1 ) ;
109- }
93+ }
94+ if ( breadthFirst ) {
95+ // Process queue
96+ while ( queue . length > 0 && ! isBreak ) {
97+ const current = queue . shift ( ) ;
98+ const { item, index, array, tree, parent, level } = current ! ;
99+ const re = iterator ( item , index , array , tree , parent , level ) ;
100+ if ( re === false ) {
101+ isBreak = true ;
102+ break ;
103+ } else if ( re === true ) {
104+ continue ;
105+ }
106+ if ( item && ( isDomNode ? isNodeList ( item [ childField ] ) : Array . isArray ( item [ childField ] ) ) ) {
107+ reverseWalk ( item [ childField ] , item , level + 1 ) ;
110108 }
111109 }
112- } else {
113- for ( let index = 0 , len = arr . length ; index < len ; index ++ ) {
114- if ( isBreak ) {
110+ }
111+ } ;
112+ const walk = ( arr : ArrayLike < V > , parent : V | null , level = 0 ) => {
113+ for ( let index = 0 , len = arr . length ; index < len ; index ++ ) {
114+ if ( isBreak ) {
115+ break ;
116+ }
117+ const item = arr [ index ] ;
118+ if ( breadthFirst ) {
119+ // 广度优先
120+ queue . push ( { item, index : index , array : arr , tree, parent, level } ) ;
121+ } else {
122+ // 深度优先
123+ const re = iterator ( item , index , arr , tree , parent , level ) ;
124+ if ( re === false ) {
125+ isBreak = true ;
115126 break ;
127+ } else if ( re === true ) {
128+ continue ;
116129 }
117- const item = arr [ index ] ;
118- if ( breadthFirst ) {
119- // 广度优先
120- queue . push ( { item, index : index , array : arr , tree, parent, level } ) ;
121- } else {
122- // 深度优先
123- const re = iterator ( item , index , arr , tree , parent , level ) ;
124- if ( re === false ) {
125- isBreak = true ;
126- break ;
127- } else if ( re === true ) {
128- continue ;
129- }
130-
131- if ( item && ( isDomNode ? isNodeList ( item [ childField ] ) : Array . isArray ( item [ childField ] ) ) ) {
132- walk ( item [ childField ] , item , level + 1 ) ;
133- }
130+ if ( item && ( isDomNode ? isNodeList ( item [ childField ] ) : Array . isArray ( item [ childField ] ) ) ) {
131+ walk ( item [ childField ] , item , level + 1 ) ;
134132 }
135133 }
136- if ( breadthFirst ) {
137- while ( queue . length > 0 && ! isBreak ) {
138- const current = queue . shift ( ) ;
139- if ( ! current ) break ;
140- const { item, index, array, tree, parent, level } = current ;
141- const re = iterator ( item , index , array , tree , parent , level ) ;
142- if ( re === false ) {
143- isBreak = true ;
144- break ;
145- } else if ( re === true ) {
146- continue ;
147- }
148-
149- if ( item && ( isDomNode ? isNodeList ( item [ childField ] ) : Array . isArray ( item [ childField ] ) ) ) {
150- walk ( item [ childField ] , item , level + 1 ) ;
151- }
134+ }
135+ if ( breadthFirst ) {
136+ while ( queue . length > 0 && ! isBreak ) {
137+ const current = queue . shift ( ) ;
138+ if ( ! current ) break ;
139+ const { item, index, array, tree, parent, level } = current ;
140+ const re = iterator ( item , index , array , tree , parent , level ) ;
141+ if ( re === false ) {
142+ isBreak = true ;
143+ break ;
144+ } else if ( re === true ) {
145+ continue ;
146+ }
147+ if ( item && ( isDomNode ? isNodeList ( item [ childField ] ) : Array . isArray ( item [ childField ] ) ) ) {
148+ walk ( item [ childField ] , item , level + 1 ) ;
152149 }
153150 }
154151 }
155152 } ;
156- walk ( tree , null , 0 ) ;
153+ reverse ? reverseWalk ( tree , null , 0 ) : walk ( tree , null , 0 ) ;
157154 // @ts -ignore
158155 tree = null ;
159156}
0 commit comments