Javascript: выполнить вторую обработку после завершения фильтрации массива - PullRequest
0 голосов
/ 27 февраля 2020

Мне нужно манипулировать массивом, используя два метода, один за другим:

  1. фильтр массива
  2. , затем сортировать его

мой метод фильтрации следующий

  filterArray(list){
    return list.filter(item=> !this.myCondition(item));
  }

мой метод сортировки следующий:

sortArray(list) {
    return list.sort((a, b) =>
      new Date(b.beginDate).getTime() - new Date(a.beginDate).getTime()
    );
}

Я хочу управлять им с помощью Кстати, , что его полная фильтрация, а затем выполнить сортировку

Я пробовал это:

myData = myData.filterArray(myData).sortArray(myData);

Но я не уверен что это самый чистый способ (Примечание: я хочу разделить методы сортировки и фильтрации)

лучшие способы сделать это?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020
  myData = myData
  .filter(item => !this.myCondition(item))
  .sort((a, b) => new Date(b.beginDate).getTime() - new Date(a.beginDate).getTime());

Каждой строке присваивались разные задания.

0 голосов
/ 27 февраля 2020

Array.sort не будет возврат a новый отсортированный массив . он будет сортировать на месте , что означает, что он будет мутировать массив . таким образом, возвращая что-то из вашей функции сортировки и сохраняя ее, нет смысла. если вы хотите предотвратить мутацию исходного массива, вы должны клонировать его в функции сортировки вручную, затем отсортировать, а затем вернуть. сохранить чистые функции без побочных эффектов;

sortArray(list) {
    let listClone = list.slice(0); // some fast cloning method
    listClone.sort((a, b) =>
      new Date(b.beginDate).getTime() - new Date(a.beginDate).getTime()
    );
    return listClone 
}

Поскольку фильтр каждый раз возвращает новый массив, ваш код работает просто отлично; но если вы используете функцию сортировки отдельно, это будет иметь побочные эффекты.

...