Не могу понять, как использовать .pipe (map ()) для сортировки наблюдаемого массива - PullRequest
0 голосов
/ 17 октября 2019

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

Я пробовал много разных решений, но в настоящее время самое близкое, которое я получил, наиболее близко использовалось.

let testObvs$ = of([3, 5, 2, 1, 4]);
testObvs$.pipe(map(results => {
   return results.sort((a, b) => {
    let res = compare(a, b);
    return direction === 'asc' ? res : -res;
  })
}))

testObvs$.subscribe(e => console.log(e))

Ожидаемый результат в подписке [1,2,3,4,5] вернул результат [3,4,2,1,4]

Мне нужно заказать testObvs $ на основенаправление. Я проверил функции сравнения и сортировки с помощью Number [], и они возвращают обычный массив в правильном порядке.

Я использую угловые 8.2 и rxjs 6.4.0

Конечная цельдля этого вида нужно было отсортировать массив объектов по определенному свойству, как это.

 this.questions
        .pipe(
          map(results => {
            return results.sort((a, b) => {
              let res = compareString(a[column].replace(/<.*?>/g, ''), 
b[column].replace(/<.*?>/g, ''));
              debugger;
              return direction === 'asc' ? res : -res;
            })
          })
        ).subscribe();


export const compareString = ( a, b ) => {
if ( a < b ){
    return -1;
  }
  if ( a > b ){
    return 1;
  }
  return 0;
}

1 Ответ

1 голос
/ 17 октября 2019

Есть некоторые проблемы с вашей реализацией. Не уверен, какой метод сравнения вы вызываете здесь.

Но вам просто нужно вернуть boolean в зависимости от того, больше ли число, чем следующее. Для чисел это довольно просто, хотя. Здесь взгляните на примеры MDN для sort.

Попробуйте:

let testObvs$ = of([3, 5, 2, 1, 4]);
    testObvs$
      .pipe(
        map(results => {
          return results.sort((a, b) => (direction === "asc" ? a - b : b - a));
        })
      )
      .subscribe(res => console.log(res));
...