Added advanced search function
This commit is contained in:
		
							
								
								
									
										5184
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										5184
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -13,6 +13,7 @@ export * from './misc'; | |||||||
| export * from './objects'; | export * from './objects'; | ||||||
| export * from './path-events'; | export * from './path-events'; | ||||||
| export * from './promise-progress'; | export * from './promise-progress'; | ||||||
|  | export * from './search'; | ||||||
| export * from './string'; | export * from './string'; | ||||||
| export * from './time'; | export * from './time'; | ||||||
| export * from './types'; | export * from './types'; | ||||||
|   | |||||||
							
								
								
									
										38
									
								
								src/search.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/search.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | import {dotNotation, JSONAttemptParse} from '@ztimson/utils'; | ||||||
|  |  | ||||||
|  | export function search(rows: any[], search: string, regex?: boolean, transform: Function = (r: any) => r) { | ||||||
|  | 	if(!rows) return []; | ||||||
|  | 	return rows.filter(r => { | ||||||
|  | 		// Empty search | ||||||
|  | 		const value = transform(r); | ||||||
|  | 		if(!search) return true; | ||||||
|  | 		// Regex search | ||||||
|  | 		if(regex) { | ||||||
|  | 			return !!Object.values(value).filter((v: any) => { | ||||||
|  | 				try { return RegExp(search, 'gm').test(v.toString()); } | ||||||
|  | 				catch { return false; } | ||||||
|  | 			}).length | ||||||
|  | 		} | ||||||
|  | 		// Make sure at least one OR passes | ||||||
|  | 		const or = search.split('||').map(p => p.trim()).filter(p => !!p); | ||||||
|  | 		return -1 != or.findIndex(p => { | ||||||
|  | 			// Make sure all ANDs pass | ||||||
|  | 			const and = p.split('&&').map(p => p.trim()).filter(p => !!p); | ||||||
|  | 			return and.filter(p => { | ||||||
|  | 				// Boolean operator | ||||||
|  | 				const prop = /(\w+)\s*(==?|!=|>=|>|<=|<)\s*(\w+)/g.exec(p); | ||||||
|  | 				if(prop) { | ||||||
|  | 					const a = JSON.stringify(JSONAttemptParse(dotNotation<any>(value, prop[1]))); | ||||||
|  | 					const operator = prop[2] == '=' ? '==' : prop[2]; | ||||||
|  | 					const b = JSON.stringify(JSONAttemptParse(prop[3])); | ||||||
|  | 					return eval(`${a} ${operator} ${b}`); | ||||||
|  | 				} | ||||||
|  | 				// Case-sensitive | ||||||
|  | 				const v = Object.values(value).join(''); | ||||||
|  | 				if(/[A-Z]/g.test(search)) return v.includes(p); | ||||||
|  | 				// Case-insensitive | ||||||
|  | 				return v.toLowerCase().includes(p); | ||||||
|  | 			}).length == and.length; | ||||||
|  | 		}) | ||||||
|  | 	}); | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user