import type { Resource } from "@src/tems"; const calculatePertinenceScore = ( data: any, lowerCaseString: string, key?: string ): number => { if (data === null || data === undefined) { return 0; } if (typeof data !== "object") { const valueString = String(data).toLowerCase(); const escapedString = lowerCaseString.replace( /[.*+?^${}()|[\]\\]/g, "\\$&" ); const wholeWordRegex = new RegExp(`\\b${escapedString}\\b`); let score = 0; if (wholeWordRegex.test(valueString)) { if (key === "name" || key === "title") { score = 4; } else { score = 3; } } else if (valueString.includes(lowerCaseString)) { if (key === "name" || key === "title") { score = 2; } else { score = 1; } } return score; } if (Array.isArray(data)) { let maxScore = 0; for (const item of data) { maxScore = Math.max( maxScore, calculatePertinenceScore(item, lowerCaseString) ); if (maxScore === 4) break; } return maxScore; } let maxScore = 0; for (const [currentKey, value] of Object.entries(data)) { maxScore = Math.max( maxScore, calculatePertinenceScore(value, lowerCaseString, currentKey) ); if (maxScore === 4) break; } return maxScore; }; const filterObjectByValue = (array: Resource[], searchString: string): any[] => { if (!searchString || searchString.trim() === "") { return array; } const lowerCaseString = searchString.toLowerCase(); const scoredObjects = array.map((obj) => ({ obj, score: calculatePertinenceScore(obj, lowerCaseString), })); const filteredObjects = scoredObjects.filter((item) => item.score > 0); filteredObjects.sort((a, b) => b.score - a.score); return filteredObjects.map((item) => item.obj); }; export default filterObjectByValue;