Сортировать список по определенному слову

Мне нужно отсортировать список массива по определенному слову. Любая помощь будет оценена по достоинству. Спасибо.

 List=[microphone,phone,telephone,mobilephone]
    
 word = "pho"

Ответ должен быть,

answer=[телефон,телефон,микрофон,мобильный телефон]

Вы имеете в виду сортировку по позиции, в которой это слово можно найти в исходном слове?

Pauline Nemchak 21.12.2020 11:51

На основе расстояния искомого слова от начала?

adiga 21.12.2020 11:51

да вот так. Позиция «фо» в списке слов

Katara 21.12.2020 11:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
583
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать 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. Но ОП не упомянул этот сценарий.

adiga 21.12.2020 12:00

Это хорошая отправная точка, но она потребует некоторой доработки; если вы проверите его, используя подстроки, которые присутствуют только в некоторых словах (например, sortBySubstring(list, "ile");, вы поймете, что я имею в виду.

secan 21.12.2020 12:02

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

Reyno 21.12.2020 12:59

Немного длиннее, чем ответ Рейно, но он перемещает строки, которых нет в массиве, в конец.

// 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))

adiga 21.12.2020 12:44

Спасибо, Джек Чайлдс, за поддержку.

Katara 21.12.2020 15:50

Другие вопросы по теме

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