В основном я пытаюсь отсортировать массив на основе определенного совпадения строк. Я хочу, чтобы квалификатор === 'oip' сортировался вверх
[
{
qualifier: 'abc',
},
{
qualifier: 'oip'
}
]
Как бы я сделал это с x.sort((a,b) =>



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


Это должно сделать:
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». рабочий пример
Не в Фаерфоксе. Подумайте об этом: ваш код говорит, что если первая запись является "oip", она должна отсортировать после вторую. На самом деле компаратор сортировки всегда должен проверять оба аргумента; если бы оба были "oip", ваш компаратор мог бы вызвать странное поведение.
Если вы хотите применить другой тип упорядочения (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 это будет поймано первым if предложением, поэтому элемент, содержащий q1, будет идти первым. Вы можете явно объявить другое условие, которое проверяет, равны ли оба oip и возвращают 0, но, на мой взгляд, это не изменит окончательный вывод (если я что-то не упустил).
Что ж, лично я считаю плохой практикой не гарантировать, что компаратор сортировки вернет один и тот же ответ при сравнении одних и тех же двух элементов, несмотря ни на что в том порядке, в котором они были переданы (потому что вы не можете этого предсказать; два элемента из массива могут быть «а» и «б» в одном вызове, но «б» и «а» в другом).
Я думаю, что это приводит к обратному порядку;
"oip"предполагается сортировка по верх.