Как отсортировать данный массив?

236
03 октября 2021, 06:00

Имеется следующий код

    var bool = [false, false, false];
var names = ["Банан", "Яблоко", "Груша"];
var prices = [10, 20, 30]

var text;
a = names.indexOf(text) >= 0;
b = !names.indexOf(text) >= 0;

function checkbuy (names) {
while (text != 0)
{
  text = prompt("cписок продуктов: " + names)
names.sort(function(){ })  **//ВОТ ЭТА СТРОКА!**  
  if (names.indexOf(text) >= 0)
  {
    bool[names.indexOf(text)] = true;
    alert("Продукт " + text.toUpperCase() + " куплен!");
  }
  for (i = 0; i < names.length; i++)
  {
    var myList = [ [names[i], prices[i], bool[i]], [names[i], prices[i], bool[i]], [names[i], prices[i], bool[i]] ];
    // alert(myList[i][0]);
    alert(names[i])
  }
  alert(names);
}

}

Хочу отсортировать массив таким образом, чтобы сначала шли значения, выведенные в prompt, и совпадающие с элементами массива, а потом лишь те, которые в prompt не выведены. Как реализовать подобную сортировку массива? Ломаю голову, не могу придумать.

Заранее благодарю!

Answer 1

Тут правда есть жесткий формат того, что должно быть в prompt. Не учитываются значения, которых нет в names + лишние символы будут только мешать. Но это уже дело калибровки и форматирования

const names = ["Банан", "Яблоко", "Груша", "Вишня", ]; 
const userInput = prompt('список товаров:', names); 
const userNames = userInput.split(','); 
 
console.log(names.sort((a, b) => { 
  // Немного js магии, Number(true) === 1, Number(0) === 0 
  // Функция sort должна возвращать число, в зависимости от того 
  // какой элемент должен идти первым. 
  return Number(userNames.includes(b)) - Number(userNames.includes(a)); 
}));

Подробнее про sort

UPD
Чуть более оптимизированный вариант без сортировки

const names = ["Банан", "Яблоко", "Груша", "Вишня", ]; 
const userInput = prompt('список товаров:', names); 
const userNames = userInput.split(','); 
 
const result = {included: [], excluded: []}; 
names.forEach(name => { 
  userNames.includes(name) ? 
    result.included.push(name) : 
    result.excluded.push(name); 
}); 
 
console.log(...result.included, ...result.excluded);

READ ALSO
JavaScript вопрос Intl.DateTimeFormat странно выводит секунды

JavaScript вопрос Intl.DateTimeFormat странно выводит секунды

ожидалось, что секунды будут выводиться в формате 01 02 03, но вместо этого выводятся 1 2 3, при чем когда я вывожу не только секунды, а и минуты

104
Как сделать замену в захваченном регуляркой тексте?

Как сделать замену в захваченном регуляркой тексте?

Как можно произвести замены только по захваченному регуляркой тексту? Есть файл, где нужно поменять содержимое определённых теговПример:

159
Как вывести в переменную JS ответ от Yandex Translation API?

Как вывести в переменную JS ответ от Yandex Translation API?

Всем приветЕсть необходимость переводить отдельные строки с одного языка на другой

162
Github как правильно устанавливать и пользоваться пакетами

Github как правильно устанавливать и пользоваться пакетами

Здраствуйте, подскажите, как правильно пользоваться GitHub? Через npm умею устанавливать пакеты, а как их правильно подключить к проекту не могу...

221