@Meinerdi

Как сократить код?

Есть такие 2 хэндлера сортировки:
onSortByName = (sorted) => {
    if (this.state.searchActivated) {
      this.setState(state => {
        return {
          searchedTasks: state.searchedTasks.map(i => i).sort( (a, b) => {
            if (sorted) {
              if(a.name.toLowerCase() > b.name.toLowerCase()) {
                return 1
              } else {
                return -1
              }
            } else {
              if(a.name.toLowerCase() < b.name.toLowerCase()) {
                return 1
              } else return -1
            }
          })
        }
      })
    } else {
      this.setState(state => {
        return {
          tasks: state.tasks.map(i => i).sort( (a, b) => {
            if (sorted) {
              if(a.name.toLowerCase() > b.name.toLowerCase()) {
                return 1
              } else {
                return -1
              }
            } else {
              if(a.name.toLowerCase() < b.name.toLowerCase()) {
                return 1
              } else return -1
            }
          })
        }
      })
    }
  }

  onSortByDate = (sorted) => {
    if(this.state.searchActivated) {
      this.setState(state => {
        return {
          searchedTasks: state.searchedTasks.map(i => i).sort( (a, b) => {
            if (sorted) {
              if(a.date > b.date) {
                return 1
              } else {
                return -1
              }
            } else {
              if(a.date < b.date) {
                return 1
              } else return -1
            }
          })
        }
      })
    } else {
      this.setState(state => {
        return {
          tasks: state.tasks.map(i => i).sort( (a, b) => {
            if (sorted) {
              if(a.date > b.date) {
                return 1
              } else {
                return -1
              }
            } else {
              if(a.date < b.date) {
                return 1
              } else return -1
            }
          })
        }
      })
    }
  }

Понимаю что дичь дичайшая, и что DRY тут плачет. Как оптимизировать?
  • Вопрос задан
  • 133 просмотра
Решения вопроса 3
Benzin102
@Benzin102
Shitcoder
onSortByName = (sorted) => {
	this.setState(state => {
		return {
			if (this.state.searchActivated) {
				searchedTasks: state.searchedTasks.map(i => i).sort( (a, b) => {
					return (a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1) * (!sorted ? -1 : 1);
				})
			} else {
				tasks: state.tasks.map(i => i).sort( (a, b) => {
					return (a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1) * (!sorted ? -1 : 1);
				})
			}
		}
	})
}

onSortByDate = (sorted) => {
	this.setState(state => {
		return {
			if (this.state.searchActivated) {
				searchedTasks: state.searchedTasks.map(i => i).sort( (a, b) => {
					return (a.date > b.date ? 1 : -1) * (!sorted ? -1 : 1);
				})
			} else {
				tasks: state.tasks.map(i => i).sort( (a, b) => {
					return (a.date > b.date ? 1 : -1) * (!sorted ? -1 : 1);
				})
			}
		}
	})
}

Как то так МБ
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
Сравнение значений: у строк есть метод localeCompare; даты в основе своей являются числами - их можно вычитать.

Направление сортировки: умножаем результат сравнения на +/- 1, в зависимости от значения sorted.

Выбор массива, который надо сортировать: сохраняем имя соответствующего свойства в переменную, дальше используем её при обращении к стейту.

Остальной повторяющийся код выносим в отдельный метод, который будет получать в качестве параметра функцию сравнения значений.

sort = (sorted, sortFunc) => {
  const toSort = this.state.searchActivated ? 'searchedTasks' : 'tasks';

  this.setState(state => ({
    [toSort]: [...state[toSort]].sort((a, b) => sortFunc(a, b) * (sorted ? -1 : 1)),
  }));
}

onSortByName = (sorted) => {
  this.sort(sorted, (a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
}

onSortByDate = (sorted) => {
  this.sort(sorted, (a, b) => a.date - b.date);
}
Ответ написан
hahenty
@hahenty
('•')
//на основе sorted заготовим смещение и разворот
let off = -1, tur = -2;
if( sorted ) { off = 1; tur = 2 };
/*...*/
.map( (a,b) => off - tur * (a.prop > b.prop) ) // prop - это свойство для сравнения

можно поправить off и tur, смотря в какую сторону больше-меньше сработает.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы