@Hancock_888

Как сортивать данные по количеству ошибок?

Пользователь вводит название города, мне надо сравнить то что он ввел с городом из базы и вернуть массив объектов кто там живет, реализовал две функции сравнения
checkMatch1 сравнение по полному совпадению
checkMatch2 сравнение на частичное совпадение, когда пользователь вводит название города с ошибкой. Есть ограничение что пользователь сделал не больше 2 ошибок.

levenshtein вернет число сколько символов нужно заменить в строке2 что бы получилась строка 1.
к данному примеру:
Mexino Maxino 1 заменить один символ что бы из Mexino получилось Maxino
Mexino Mexann 2
Mexino Mexico 1
и необходимо сортировать по возрастанию количество ошибок.

Как мне отсортировать по количеству ошибок?
Дайте советы как лучше это сделать?

Код для примера:
var _data = [{
		'name': 'Nick',
		'country': 'Maxana'  // не подойдет, т.к нужно заменить 3 символа при максимум 2

	}, {
		'name': 'Chack',
		'country': 'Maxino'

	}, {
		'name': 'Adam',
		'country': 'Mexann'

	}, {
		'name': 'Kent',
		'country': 'Mexico'

	}],
	_result = [];


function getResult(request) {
	if (checkMatch(checkMatch1, request, 'country') || checkMatch(checkMatch2, request, 'country')) {
		return _result;
	}
}

function checkMatch(callback, request, searchItem) {
	var i;
	for (i in _data) {
		var obj = _data[i];
		if (callback(request, obj[searchItem])) {
			_result.push({
				name: obj['name'],
				country: obj['country']
			});
		}
	}

	if (_result.length) {
		return true;
	} else {
		return false;
	}
}

function checkMatch1(request, searchItem) {
	if (request === searchItem) {
		return true;
	} else {
		return false;
	}
}


function checkMatch2(request, searchItem) {
	var countError = 2;

	if (levenshtein(request, searchItem) <= countError) {
		console.log(request, searchItem, levenshtein(request, searchItem));
		return true;
	} else {
		return false;
	}
}
// Result где цифра это количество ошибок
// Mexino Maxino 1 
// Mexino Mexann 2
// Mexino Mexico 1 


function levenshtein(s1, s2) {
	if (s1 == s2) {
		return 0;
	}

	var s1_len = s1.length;
	var s2_len = s2.length;
	if (s1_len === 0) {
		return s2_len;
	}
	if (s2_len === 0) {
		return s1_len;
	}

	// BEGIN STATIC
	var split = false;
	try {
		split = !('0')[0];
	} catch (e) {
		split = true; // Earlier IE may not support access by string index
	}
	// END STATIC
	if (split) {
		s1 = s1.split('');
		s2 = s2.split('');
	}

	var v0 = new Array(s1_len + 1);
	var v1 = new Array(s1_len + 1);

	var s1_idx = 0,
		s2_idx = 0,
		cost = 0;
	for (s1_idx = 0; s1_idx < s1_len + 1; s1_idx++) {
		v0[s1_idx] = s1_idx;
	}
	var char_s1 = '',
		char_s2 = '';
	for (s2_idx = 1; s2_idx <= s2_len; s2_idx++) {
		v1[0] = s2_idx;
		char_s2 = s2[s2_idx - 1];

		for (s1_idx = 0; s1_idx < s1_len; s1_idx++) {
			char_s1 = s1[s1_idx];
			cost = (char_s1 == char_s2) ? 0 : 1;
			var m_min = v0[s1_idx + 1] + 1;
			var b = v1[s1_idx] + 1;
			var c = v0[s1_idx] + cost;
			if (b < m_min) {
				m_min = b;
			}
			if (c < m_min) {
				m_min = c;
			}
			v1[s1_idx + 1] = m_min;
		}
		var v_tmp = v0;
		v0 = v1;
		v1 = v_tmp;
	}
	return v0[s1_len];
}

console.group( getResult('Mexino') );


44afffc6824c41d29c3a7a65a4e632ad.jpg
а надо сортировать объекты по ошибкам, что был такой порядок
Mexino Maxino 1
Mexino Mexico 1
Mexino Mexann 2
  • Вопрос задан
  • 2319 просмотров
Решения вопроса 1
Alexufo
@Alexufo
противоречивый, сложный, весь компьютерный.
количество ошибок поставьте первым символом и сортируйте.
// 1 Mexino Maxino
// 1 Mexino Mexico
// 2 Mexino Mexann
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы