Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.03.2017, 22:28
Аспирант
Отправить личное сообщение для innowed Посмотреть профиль Найти все сообщения от innowed
 
Регистрация: 27.03.2015
Сообщений: 78

сортировка по вхождению слов алфавита в слово (релевантная?)
Здравствуйте! Есть большой словарь (но слова могут содержать цифры и вообще любые символы), нужно из него доставать слова, которые совпадают с введённым словом.
В лоб такое решение сделал
let words = [] //большой словарь
let value; //искомое слово
let result = words.filter(i => i.word.toLowerCase().indexOf(value.toLowerCase()) >=0 );

Допустим, я отфильтровал слова по букве "М", тогда в выборку попадут слова которые не только на эту букву начинаются, но и содержат её на других позициях.

Тогда я сортирую такой массив
result.sort((a, b)=>{
	let min = Math.min(a.word.length, b.word.length);
	
	for(let i = 0; i < min.length; i++) {
		
		if(a.word[i] > b.word[i]) {
			return 1;
		}
		if(a.word[i] < b.word[i]) {
			return -1;
		}
	}
	return 0;
});

Но это не дало результата, всё ещё лезут слова без буквы "М" на первой позиции.
Что я упускаю? (((
Ответить с цитированием
  #2 (permalink)  
Старый 11.03.2017, 22:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

innowed,
может сразу
let result = words.filter(i => i.word.toLowerCase().indexOf(value.toLowerCase()) ==0 );
Ответить с цитированием
  #3 (permalink)  
Старый 11.03.2017, 23:12
Аспирант
Отправить личное сообщение для innowed Посмотреть профиль Найти все сообщения от innowed
 
Регистрация: 27.03.2015
Сообщений: 78

хм, что-то получилось))
let rawList = words.filter( i => i.word.toLowerCase().indexOf(value.toLowerCase()) == 0 );

var map = rawList.map(function(e, i) {
  return { index: i, value: e.word.toLowerCase() };
});

map.sort(function(a, b) {
	if(a.value.indexOf('.') != -1) return 1; //точка поднимает слово на самый верх
	return +(a.value > b.value) || +(a.value === b.value) - 1;
});

var result = map.map(function(e) {
  return rawList[e.index];
});

осталось добавить монитор
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск