feat(ObjectSorter): now sorts objects by likability

This commit is contained in:
Philipp Kunz 2018-08-19 20:52:52 +02:00
parent fdf9ec6358
commit dc856dd5c7
4 changed files with 56 additions and 8 deletions

View File

@ -14,11 +14,30 @@ tap.test('should create an instance of Smartfuzzy', async () => {
}); });
tap.test('should compute a score', async () => { tap.test('should compute a score', async () => {
testSmartfuzzy.getChangeScoreForString('Apple'); const result = testSmartfuzzy.getChangeScoreForString('Apple');
console.log(result);
}); });
tap.test('should get closest match', async () => { tap.test('should get closest match', async () => {
testSmartfuzzy.getClosestMatchForString('Apple'); const result = testSmartfuzzy.getClosestMatchForString('Apple');
console.log(result);
});
tap.test('should sort objects', async () => {
class Car {
constructor(public brand: string) {}
}
let testObjectSorter: smartfuzzy.ObjectSorter<Car>;
testObjectSorter = new smartfuzzy.ObjectSorter([
new Car('BMW'),
new Car('Mercedes Benz'),
new Car('Volvo')
]);
const result = testObjectSorter.sort('Volvo', ['brand']);
console.log(result);
}); });
tap.start(); tap.start();

View File

@ -1 +1,2 @@
export * from './smartfuzzy.classes.smartfuzzy'; export * from './smartfuzzy.classes.smartfuzzy';
export * from './smartfuzzy.classes.objectsorter';

View File

@ -0,0 +1,26 @@
import * as plugins from './smartfuzzy.plugins';
export class ObjectSorter<T> {
public objectDictionary: T[];
constructor(objectDictionaryArg: T[] = []) {
this.objectDictionary = objectDictionaryArg;
}
sort(stringArg: string, objectKeysArg: string[]): T[] {
const fuseOptions = {
shouldSort: true,
threshold: 0.6,
location: 0,
distance: 100,
maxPatternLength: 32,
minMatchCharLength: 1,
keys: objectKeysArg
};
const fuse = new plugins.fuseJs(this.objectDictionary, fuseOptions);
const result = fuse.search(stringArg);
return result;
}
}

View File

@ -2,6 +2,8 @@ import * as plugins from './smartfuzzy.plugins';
export let standardExport = 'Hi there! :) This is an exported string'; export let standardExport = 'Hi there! :) This is an exported string';
export type TDictionaryMap = { [key: string]: number };
export class Smartfuzzy { export class Smartfuzzy {
dictionary: string[]; dictionary: string[];
constructor(dictionary: string[]) { constructor(dictionary: string[]) {
@ -24,12 +26,12 @@ export class Smartfuzzy {
* returns the closest match for a given string * returns the closest match for a given string
* @param stringArg * @param stringArg
*/ */
getChangeScoreForString(stringArg) { getChangeScoreForString(stringArg): TDictionaryMap {
const dictionaryMap: { [key: string]: number } = {}; const dictionaryMap: TDictionaryMap = {};
for (const wordArg of this.dictionary) { for (const wordArg of this.dictionary) {
dictionaryMap[wordArg] = plugins.leven(stringArg, wordArg); dictionaryMap[wordArg] = plugins.leven(stringArg, wordArg);
} }
console.log(dictionaryMap); return dictionaryMap;
} }
getClosestMatchForString(stringArg: string) { getClosestMatchForString(stringArg: string) {
@ -39,7 +41,7 @@ export class Smartfuzzy {
name: wordArg name: wordArg
}); });
} }
const options = { const fuseOptions = {
shouldSort: true, shouldSort: true,
threshold: 0.6, threshold: 0.6,
location: 0, location: 0,
@ -48,8 +50,8 @@ export class Smartfuzzy {
minMatchCharLength: 1, minMatchCharLength: 1,
keys: ['name'] keys: ['name']
}; };
const fuse = new plugins.fuseJs(fuseDictionary, options); const fuse = new plugins.fuseJs(fuseDictionary, fuseOptions);
const result = fuse.search(stringArg); const result = fuse.search(stringArg);
console.log(result); return result;
} }
} }