Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
ff4401934c | |||
ce3c8d012a | |||
a86e8350ee | |||
7b4e17e4c4 |
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@ztimson/utils",
|
"name": "@ztimson/utils",
|
||||||
"version": "0.22.8",
|
"version": "0.22.10",
|
||||||
"description": "Utility library",
|
"description": "Utility library",
|
||||||
"author": "Zak Timson",
|
"author": "Zak Timson",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
@ -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 './objects';
|
||||||
|
|
||||||
|
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;
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
@ -100,7 +100,7 @@ export function formatDate(date: Date | number | string, format = 'YYYY-MM-DD H:
|
|||||||
.replaceAll('YY', date.getFullYear().toString().slice(2))
|
.replaceAll('YY', date.getFullYear().toString().slice(2))
|
||||||
// Month
|
// Month
|
||||||
.replaceAll('MMMM', month(date.getMonth()))
|
.replaceAll('MMMM', month(date.getMonth()))
|
||||||
.replaceAll('MMM', month(date.getMonth()).slice(0, 2))
|
.replaceAll('MMM', month(date.getMonth()).slice(0, 3))
|
||||||
.replaceAll('MM', (date.getMonth() + 1).toString().padStart(2, '0'))
|
.replaceAll('MM', (date.getMonth() + 1).toString().padStart(2, '0'))
|
||||||
.replaceAll('M', (date.getMonth() + 1).toString())
|
.replaceAll('M', (date.getMonth() + 1).toString())
|
||||||
// Day
|
// Day
|
||||||
|
Reference in New Issue
Block a user