Не правильно работает сортировка по названию языков но с исключением для дефолтного языка
Есть массив обьектов с названием языков 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);