Массив сортировки Javascript на основе определенной строки

В основном я пытаюсь отсортировать массив на основе определенного совпадения строк. Я хочу, чтобы квалификатор === 'oip' сортировался вверх

[
 {
  qualifier: 'abc',
 },
 {
  qualifier: 'oip'
 }
]

Как бы я сделал это с x.sort((a,b) =>

Поведение ключевого слова "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
0
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Это должно сделать:

x.sort((a,b) => a === 'oip'? 1 : -1)

Вы можете узнать больше о сортировать здесь.

If a and b are two elements being compared, then:

  • If compareFunction(a, b) is less than 0, sort a to an index lower than b (i.e. a comes first).
  • If compareFunction(a, b) returns 0, leave a and b unchanged with respect to each other, but sorted with respect to all different elements. Note: the ECMAscript standard does not guarantee this behaviour, and thus not all browsers (e.g. Mozilla versions dating back to at least 2003) respect this.
  • If compareFunction(a, b) is greater than 0, sort b to an index lower than a (i.e. b comes first).
  • compareFunction(a, b) must always return the same value when given a specific pair of elements a and b as its two arguments. If inconsistent results are returned then the sort order is undefined.

Этот ответ работал для примера, указанного OP. Однако, чтобы быть более полным (спасибо за указание на это @Пойнти), вот полная версия:

x = [
 {qualifier: 'abc'},
 {qualifier: 'oip'},
 {qualifier: 'def'},
 {qualifier: 'gij'},
 {qualifier: 'oip'},
];

y = x.sort((a, b) => {
  if (a.qualifier === b.qualifier && a.qualifier === 'oip') {
    return 0;
  } else if (a.qualifier === 'oip') {
    return -1;
  } else if (b.qualifier === 'oip') {
    return 1;
  }else {
    return a.qualifier > b.qualifier? 1 : -1;
  }
});

Я думаю, что это приводит к обратному порядку; "oip" предполагается сортировка по верх.

Pointy 05.03.2019 00:14

Только что протестировал его на хроме, и сверху появляется «oip». рабочий пример

Ibu 05.03.2019 00:15

Не в Фаерфоксе. Подумайте об этом: ваш код говорит, что если первая запись является "oip", она должна отсортировать после вторую. На самом деле компаратор сортировки всегда должен проверять оба аргумента; если бы оба были "oip", ваш компаратор мог бы вызвать странное поведение.

Pointy 05.03.2019 00:27

Если вы хотите применить другой тип упорядочения (ascending или descending) к остальным элементам и иметь элементы с квалификатором, равным oip, наверху, вы можете сделать что-то вроде этого (в примере к элементам применяется порядок возрастания). остальные элементы):

const input = [
 {qualifier: 'abc', id: "1"},
 {qualifier: 'oip', id: "2"},
 {qualifier: 'def', id: "3"},
 {qualifier: 'oip', id: "4"},
];

input.sort(({qualifier: q1}, {qualifier: q2}) =>
{      
    if (q1 === 'oip' && q2 === 'oip')
        return 0;
    else if (q1 === 'oip')
        return -1;
    else if (q2 === 'oip')
        return 1;
    else
        return q1.localeCompare(q2);
});

console.info(input);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

что, если они обе "oip"?

Pointy 05.03.2019 00:28

@Pointy это будет поймано первым if предложением, поэтому элемент, содержащий q1, будет идти первым. Вы можете явно объявить другое условие, которое проверяет, равны ли оба oip и возвращают 0, но, на мой взгляд, это не изменит окончательный вывод (если я что-то не упустил).

Shidersz 05.03.2019 00:40

Что ж, лично я считаю плохой практикой не гарантировать, что компаратор сортировки вернет один и тот же ответ при сравнении одних и тех же двух элементов, несмотря ни на что в том порядке, в котором они были переданы (потому что вы не можете этого предсказать; два элемента из массива могут быть «а» и «б» в одном вызове, но «б» и «а» в другом).

Pointy 05.03.2019 00:43

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