fittingStrings.js 2.25 KB
/*
 * requires levenshtein.js to be loaded first
 */

function distsort (_a, _b)
{
	var a = _a.split ('::');
	var b = _b.split ('::');
	var cmp = a[0] - b[0];

	if (cmp == 0)
		return (a[2]==b[2])?0:(a[2]<b[2])?-1:1;

	return cmp;
}

function fittingStrings (search, strings, cs)
{
	var dists = new Array ();

	if (search.length <= 0)
		return dists;

	if (cs == false)
		_search = search.toUpperCase ();
	else
		_search = search;

	/*
	 * hier suche ich die zur Eingabe am besten passenden Eintraege
	 * in der Datenbank. Neben der eigentlichen distance ermittle ich noch
	 * einen Wert distance - Ueberhang(Datenbankstring zu Suchstring)
	 * Zweiter eignet sich besser zum Vergleich der Ergebnisse untereinander.
	 */
	for (str in strings)
	{
		if (cs == false)
			_str = strings[str].toUpperCase ();
		else
			_str = strings[str];

		var dist = levenshtein (_search, _str);

		// --- neue version ---------------------------------
		// in dieser version wird die Ähnlichkeit nur bis 
		// zu der Länge des kürzesten Strings geprüft, daher
		// werden Ähnlichkeiten im hinteren Stringbereich
		// nicht berücksichtigt. Hat zur folge das man wenn
		// man z.B. nur 's' mit anderen Strings vergleicht
		// als erste die Strings aufgelistet bekommt die mit s
		// anfangen, die andere Version listet die, in denen 
		// ein s vorkommt.
		var minLen  = (_str.length < _search.length)?
			_str.length:_search.length;
		var subDist = levenshtein (
			_search.substr (0, minLen), _str.substr (0, minLen));
		// --------------------------------------------------

		// --- alte version ---------------------------------
		// in dieser Version kommen die ähnlicheren Strings
		// weiter nach oben, allerding wird die Position der
		// Ähnlichkeit nicht berücksichtigt...
		// Wenn die neue Version -1 gebracht hat schau ob
		// überhaupt eine Ähnlichkeit drinsteckt, gib der
		// aber ein penalty von minLen mit damit die nicht
		// über den Einträgen steht die in der neuen Version
		// ermittelt wurden.
		if (subDist == minLen)
		{
			var delta  = _str.length - _search.length;
			subDist   += (delta > 0)? dist - delta: dist;
		}
		// --------------------------------------------------

		dists.push (subDist + '::' + dist + '::' + strings[str]);
	}
	
	dists.sort(distsort);

	return dists;
}