Типографский сортировочный массив объектов по его свойствам

#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. Рад, что все получилось :).. Можете ли вы отметить мой ответ как принятый?.