Мне нужно отсортировать список массива по определенному слову. Любая помощь будет оценена по достоинству. Спасибо.
List=[microphone,phone,telephone,mobilephone]
word = "pho"
Ответ должен быть,
answer=[телефон,телефон,микрофон,мобильный телефон]
На основе расстояния искомого слова от начала?
да вот так. Позиция «фо» в списке слов



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать indexOf() , чтобы получить номер индекса и передать его методу sort.
const list = ["microphone", "phone", "telephone", "mobilephone"];
const sortBySubstring = (words, match) => {
return words.sort((a, b) => {
return a.indexOf(match) - b.indexOf(match);
});
}
const result = sortBySubstring(list, "pho");
console.info(result);Обновлено:
Если в вашем списке есть слово, не содержащее подстроки, оно будет помещено в начало массива. Есть несколько способов изменить это поведение.
Прежде всего, вы можете проверить, существует ли он с помощью include(), если он не существует, поместите его в конец массива.
const list = ["microphone", "phone", "telephone", "mobilephone", "telemobile"];
const sortBySubstring = (words, match) => {
return words.sort((a, b) => {
if (!a.includes(match) || !b.includes(match)) return 1;
return a.indexOf(match) - b.indexOf(match);
});
}
const result = sortBySubstring(list, "pho");
console.info(result);Другой вариант — filter() исключить слова, не содержащие указанную подстроку.
const list = ["microphone", "phone", "telephone", "mobilephone", "telemobile"];
const sortBySubstring = (words, match) => {
const contains = words.filter((word) => word.includes(match));
return contains.sort((a, b) => {
return a.indexOf(match) - b.indexOf(match);
});
}
const result = sortBySubstring(list, "pho");
console.info(result);Если поиск не найден, он переместит это слово в начало массива, потому что indexOf возвращает -1. Но ОП не упомянул этот сценарий.
Это хорошая отправная точка, но она потребует некоторой доработки; если вы проверите его, используя подстроки, которые присутствуют только в некоторых словах (например, sortBySubstring(list, "ile");, вы поймете, что я имею в виду.
Да, я не подумал о том, что слова без подстроки приведут к другому результату, я добавил несколько дополнительных фрагментов, чтобы скрыть некоторые из этих недостатков.
Немного длиннее, чем ответ Рейно, но он перемещает строки, которых нет в массиве, в конец.
// The following function was taken from here: https://stackoverflow.com/questions/16096872/how-to-sort-2-dimensional-array-by-column-value (answer by jahroy)
function compareSecondColumn(a, b) {
if (a[1] === b[1]) {
return 0;
}
else {
return (a[1] < b[1]) ? -1 : 1;
}
}
function sortByWord(list, word) {
// put data into 2d array (x) with array item and indexOf search term
var x = [];
var doesntContainWord = [];
for (var i = 0; i < list.length; i++) {
if (list[i].indexOf(word) == -1) {
// if the search word doesn't exist, push to array
doesntContainWord.push(list[i]);
} else {
x[i] = [list[i], list[i].indexOf(word)];
}
}
doesntContainWord.sort();
// now sort var x by second col.
x.sort(compareSecondColumn);
// now dump values back into array and return them
var toReturn = [];
for (var i = 0; i < x.length; i++) {
toReturn[i] = x[i][0];
}
return toReturn.concat(doesntContainWord);
}
var data = ["microphone", "phone", "telephone", "mobilephone", "cat", "animal"];
console.info(sortByWord(data, "pho"))Вы можете сделать это, отсортировав на основе существования match, прежде чем переходить к индексу comapre: List.sort((a,b) => b.includes(match) - a.includes(match) || a.indexOf(match) - b.indexOf(match))
Спасибо, Джек Чайлдс, за поддержку.
Вы имеете в виду сортировку по позиции, в которой это слово можно найти в исходном слове?