Не правильно работает сортировка по названию языков но с исключением для дефолтного языка

Есть массив обьектов с названием языков list и массив выбранных языков из этого списка selectedLanguagesId

const list = [
  {
    id: 2,
    name: 'Dutch'
  },
  {
    id: 3:
    name: 'English'
  },
  {
    id: 1:
    name: 'Italian'
  },
  ...
];

let selectedLanguagesId = [3, 2, ...];
const defaultLanguageId = 3;

Необходимо чтобы дефолтный язык был всегда впереди, а остальные сортировались по имени. Проблема с моим скриптом что он не корректно работает - не ставит дефолтный язык вперед. Буду признателен за помощь

getSelectedLanguages() {
  return this.selectedLanguagesId
    .map((id) => this.list.find((lang) => lang.id == id))
    .sort((a, b) => {
      if (a.id == this.defaultLanguageId || b.id == this.defaultLanguageId) return 0;
      if (a.name > b.name) return 1;
      if (a.name < b.name) return -1;

      return 0;
    });
},

Ответы (2 шт):

Автор решения: OPTIMUS PRIME

if (a.id == this.defaultLanguageId || b.id == this.defaultLanguageId) return 0;

return 0 означает «не менять позиции этой пары элементов». А надо как-раз толкать вверх нужный объект:

let test = {
  list: [
    { id: 2, name: "Dutch" },
    { id: 3, name: "English" },
    { id: 1, name: "Italian" },
  ],
  selectedLanguagesId: [3, 2, 1],
  defaultLanguageId: 3,

  getSelectedLanguages() {
    return this.selectedLanguagesId
      .map((id) => this.list.find((lang) => lang.id == id))
      .sort((a, b) => {
        if (a.id == this.defaultLanguageId) return -1; // <--
        if (b.id == this.defaultLanguageId) return 1;  // <--
        
        if (a.name > b.name) return 1;
        if (a.name < b.name) return -1;

        return 0;
      });
  },
};

console.log( test.getSelectedLanguages() );

→ Ссылка
Автор решения: Aziz Umarov

Наверное что-то такое хотели? Отфильтровать и отсортировать по default массив.

В примере добавлен Russian, но он не попал в список выбранных языков.

const list = [
  {
    id: 2,
    name: 'Dutch'
  },
  {
    id: 5,
    name: 'Russian'
  },
  {
    id: 3,
    name: 'English'
  },
  {
    id: 1,
    name: 'Atalian'
  }
];

function getSelectedLanguages(list) {
  let selectedLanguagesId = [1, 2, 3];
  const defaultLanguageId = 3;
  
  return list
    .filter( item => selectedLanguagesId.includes(item.id))
    .sort((a, b) => 
      a.id == defaultLanguageId ? -1: b.id == defaultLanguageId? 1 : a.name > b.name? -1: a.name < b.name? -1: 0);
}

let result  = getSelectedLanguages(list);

console.log(result);

→ Ссылка