#typescript #sorting #object
Вопрос:
Всем привет, у меня проблема с сортировкой массивов.
Это мой массив объектов, и я хотел бы создать методы для сортировки его по свойствам в обоих направлениях (по возрастанию / убыванию ).
this.products = [
{productId: 1, manufacturer: "toshiba", model: "ZXT120", description: "Good gaming laptop", quantity: 1},
{productId: 2, manufacturer: "lenovo", model: "ZXT120", description: "Good gaming laptop", quantity: 1},
{productId: 3, manufacturer: "DM", model: "ZXT120", description: "Good gaming laptop", quantity: 1},
{productId: 4, manufacturer: "Asus", model: "ZXT120", description: "Good gaming laptop", quantity: 1},
{productId: 5, manufacturer: "RX200", model: "ZXT120", description: "Good gaming laptop", quantity: 1},
]
Это то, что я придумал, но я повторяюсь в каждом методе, например, sortByModel() использует ту же логику, но как метод, приведенный ниже, но с разными свойствами
Я ищу способ создать более универсальный метод и провести его рефакторинг, но у меня нет никаких идей
sortByManufacturer() {
if (this.manufacturerSorted) {
this.manufacturerSorted = !this.manufacturerSorted;
this.products.sort((a, b) => a.manufacturer.localeCompare(b.manufacturer))
} else {
this.manufacturerSorted = !this.manufacturerSorted;
this.products.sort((a, b) => b.manufacturer.localeCompare(a.manufacturer))
}
}
Комментарии:
1. Вы можете попробовать разрешить
sortByModal()
принимать имя целевого свойства для сортировки в качестве аргумента.
Ответ №1:
Вы можете попробовать что-то вроде этого,
sortByManufacturer(keyToSortBy: string, order = 'asc') {
if (keyToSortBy) {
this.manufacturerSorted = !this.manufacturerSorted;
if(order === 'asc')
this.products.sort((a, b) => a[keyToSortBy].toLowerCase() < b[keyToSortBy].toLowerCase() ? 1 : -1)
else
this.products.sort((a, b) => a[keyToSortBy].toLowerCase() > b[keyToSortBy].toLowerCase() ? 1 : -1
}
}
Комментарии:
1. Спасибо , это то, что я искал
2. Рад, что все получилось :).. Можете ли вы отметить мой ответ как принятый?.