Angular 4 OrderBy Труба не сортируется, если имя заканчивается номером - PullRequest
0 голосов
/ 19 октября 2018

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

Я использовал пользовательский канал и получаю результаты, как и ожидалось

  • $ Яблочный фрукт -символ
  • 1Яблочный фрукт -номер
  • Яблочный фрукт - по алфавиту

Но сортировка не происходит, если имя заканчивается цифрой.

Результат сейчас:

  • Яблочный фрукт3
  • Яблочный фрукт01
  • Яблочный фрукт5
  • Яблоко fruit02

JSON

[
{"name": "Apple fruit3"},
{"name": "$Apple fruit"},
{"name": "Apple fruit"},
{"name": "Apple fruit01"},
{"name": "Apple fruit5"},
{"name": "Apple fruit02"},
]

HTML

<div *ngFor='let list of names | appOrderBy : "name" '>
<div>{{list.name}}</div>
</div>

OrderBy Custom Pipe

import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
     name: 'appOrderBy'
})
export class OrderBy implements PipeTransform {
transform(array: Array<string>, args: string): Array<string>{
array.sort((a: any, b: any) => {
  if (a[args] < b[args]) {
    return -1;
  } else if (a[args] > b[args]) {
    return 1;
  } else {
    return 0;
  }
});
return array;
}
}

1 Ответ

0 голосов
/ 19 октября 2018

Используйте Intl.Collator в качестве функции сравнения для сортировки натуральных чисел.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator

const array = [
  {name: "Apple fruit3"},
  {name: "$Apple fruit"},
  {name: "Apple fruit"},
  {name: "Apple fruit01"},
  {name: "Apple fruit5"},
  {name: "Apple fruit02"},
];

args= 'name';

var collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'});

array.sort((a, b) => collator.compare(a[args], b[args]));

console.log(array);

Я основал этот ответ на поиске поиска в Google с натуральными числами, который вернул этот пост.

Javascript: натуральная сортировка буквенно-цифровых строк

...