@@ -102,29 +102,6 @@ export const findParentNodeByKey = <U extends { edit?: boolean }>(
102102 return null ;
103103} ;
104104
105- /**
106- * 在 key 节点中添加子节点
107- * @param data 遍历的数组
108- * @param key 当前 key 值
109- * @returns 插入新数据之后的 data
110- */
111- export const appendNodeByKey = < U extends { edit ?: boolean } > (
112- data : ITreeNode < U > [ ] ,
113- key : ITreeNode < U > [ 'key' ]
114- ) : ITreeNode < U > [ ] => {
115- const newNode = { key : 'new_' , title : '' , edit : true } ;
116- return data . map ( ( node ) => {
117- if ( node . key === key ) {
118- const updatedChildren = node . children ? [ ...node . children , newNode ] : [ newNode ] ;
119- return { ...node , children : updatedChildren } ;
120- }
121- if ( node . children ) {
122- return { ...node , children : appendNodeByKey ( node . children , key ) } ;
123- }
124- return node ;
125- } ) ;
126- } ;
127-
128105/**
129106 * 移除 key 节点
130107 * @param data 遍历的数组
@@ -165,27 +142,84 @@ export const removeEditNode = <U extends { edit?: boolean }>(
165142} ;
166143
167144/**
168- *
145+ * 在指定节点的子节点列表中添加一组子节点,可以选择添加在开头或结尾
146+ * @param treeData 要操作的树节点数组
147+ * @param key 要添加子节点的目标节点 key
148+ * @param children 要添加的子节点数组
149+ * @param beforeKey 是否将子节点添加到现有子节点之前,true 表示添加到开头,false 表示添加到结尾
150+ * @returns 更新后的树节点数组
169151 */
170-
171- export const insertChildIntoNode = < U extends { edit ?: boolean } > (
152+ export const addChildrenIntoNode = < U extends { edit ?: boolean } > (
172153 treeData : ITreeNode < U > [ ] ,
173154 key : ITreeNode < U > [ 'key' ] ,
174- children : ITreeNode < U > [ ]
175- ) : ITreeNode < U > [ ] => {
176- return treeData . map ( ( node ) => {
155+ children : ITreeNode < U > [ ] ,
156+ beforeKey = true
157+ ) : ITreeNode < U > [ ] =>
158+ treeData . map ( ( node ) => {
159+ const updatedChildren = beforeKey
160+ ? [ ...children , ...( node . children || [ ] ) ]
161+ : [ ...( node . children || [ ] ) , ...children ] ;
177162 if ( node . key === key ) {
178163 return {
179164 ...node ,
180- children,
165+ children : node . children ? updatedChildren : children ,
181166 } ;
182167 }
183168 if ( node . children ) {
184169 return {
185170 ...node ,
186- children : insertChildIntoNode ( node . children , key , children ) ,
171+ children : addChildrenIntoNode ( node . children , key , children , beforeKey ) ,
187172 } ;
188173 }
189174 return node ;
190175 } ) ;
176+
177+ /**
178+ * @description 在树节点数组中查找指定 key 的节点索引
179+ * @param 要搜索的树节点数组
180+ * @param 要查找的节点 key
181+ * @returns 找到的节点索引,如果未找到则返回 -1
182+ */
183+ export const findChildIndex = < U extends { edit ?: boolean } > (
184+ data : ITreeNode < U > [ ] ,
185+ key : ITreeNode < U > [ 'key' ]
186+ ) : number => {
187+ const findIndex = data . findIndex ( ( item ) => item . key === key ) ;
188+ return findIndex ;
189+ } ;
190+
191+ /**
192+ * 在树节点数组中,根据指定的 key 找到目标节点,并将新节点插入到目标节点之前或之后。
193+ * @param {ITreeNode<U>[] } treeData - 要操作的树节点数组。
194+ * @param {ITreeNode<U>['key'] } currentKey - 目标节点的 key。
195+ * @param {ITreeNode<U> } node - 要插入的新节点。
196+ * @param {boolean } [beforeKey=true] - 是否将新节点插入到目标节点之前。true 表示之前,false 表示之后。
197+ * @returns {ITreeNode<U>[] } 更新后的树节点数组。
198+ */
199+ export const insertNodeAtKey = < U extends { edit ?: boolean } > (
200+ treeData : ITreeNode < U > [ ] ,
201+ currentKey : ITreeNode < U > [ 'key' ] ,
202+ node : ITreeNode < U > ,
203+ beforeKey = true
204+ ) : ITreeNode < U > [ ] => {
205+ const newTreeData : ITreeNode < U > [ ] = [ ] ;
206+ for ( const item of treeData ) {
207+ if ( item . key === currentKey ) {
208+ if ( beforeKey ) {
209+ newTreeData . push ( node ) ;
210+ newTreeData . push ( item ) ;
211+ } else {
212+ newTreeData . push ( item ) ;
213+ newTreeData . push ( node ) ;
214+ }
215+ } else {
216+ newTreeData . push ( {
217+ ...item ,
218+ children : item . children
219+ ? insertNodeAtKey ( item . children , currentKey , node , beforeKey )
220+ : item . children ,
221+ } ) ;
222+ }
223+ }
224+ return newTreeData ;
191225} ;
0 commit comments