我想对JSON输出进行排序。
我为此制作了自己的排序方法,如下所示:
const sortAsc = (propertyName) => (a, b) => a[propertyName] === b[propertyName] ? 0 : a[propertyName] < b[propertyName] ? -1 : 1;
const sortDesc = (propertyName) => (a, b) => a[propertyName] === b[propertyName] ? 0 : a[propertyName] < b[propertyName] ? 1 : -1;
我称之为:
asc(value) {
this.result.sort(this.sortAsc(value));
}
它的工作方式有点但是当我对它进行排序时,它总是没有排序。
看看这个小gif: https://gyazo.com/5f590f7c921eb1cb3bc4138f85c2162b
如您所见,它与ID无关。它在Naam
上升(荷兰语中的名字)但是当它下降时它首先给出2个以v&amp;开头的名字。 ķ。那是为什么?
嗯,如果那是难以修复的东西,那真的不是问题。只要它可以对数字和字符串进行排序。
还有一点需要注意,我使用的是Angular 4.4.4。我用google搜索内置排序/ orderBy函数,但发现它不是内置函数。但是如果有任何我可以使用Angular提供的东西让它更容易,我会乐意使用它!
修改
我的新方法:
sortAsc = (propertyName) => (a, b) => a[propertyName].localeCompare(b[propertyName]);
答案 0 :(得分:1)
您可以使用String#localeCompare
选项:
localeCompare()
方法返回一个数字,指示引用字符串是在排序顺序之前还是之后或与给定字符串相同。新的
locales
和options
参数允许应用程序指定应使用其排序顺序的语言,并自定义函数的行为。在忽略locales
和options
参数的旧实现中,使用的语言环境和排序顺序完全取决于实现。
const sortAsc = propertyName => (a, b) =>
a[propertyName].localeCompare(b[propertyName], undefined, { numeric: true, sensitivity: 'base' });
const sortDesc = (propertyName) => (a, b) =>
-a[propertyName].localeCompare(b[propertyName], undefined, { numeric: true, sensitivity: 'base' });
答案 1 :(得分:-1)
我想你想把Ids比作数字,所以你应该对类似数字的列使用适当的排序函数:
const sortAsc = (propertyName) => (a, b) => a[propertyName] === b[propertyName] ? 0 : +a[propertyName] < +b[propertyName] ? -1 : 1;
const sortDesc = (propertyName) => (a, b) => a[propertyName] === b[propertyName] ? 0 : +a[propertyName] < +b[propertyName] ? 1 : -1;
另一种方法是调整表数据数组,id应该是数字,而不是字符串,在这种情况下你的排序函数也应该有用。
答案 2 :(得分:-1)
您的比较功能完全正常。关系运算符在数字和字符串上都是开箱即用的,没有理由使用localeCompare
。
它的工作方式有点但是当我对它进行排序时,它总是不正确地排序:它与ID无关。
对象数组中的id
属性似乎是字符串,因此它们按字典顺序进行比较。将它们作为实际数字,它们将作为数字进行比较。
它在
Naam
上升,但是当它下降时,首先会给出2个以v&amp;开头的名字。 ķ。那是为什么?
在gif中很难看到,但看起来这两个奇怪排序的值以空格开头 - 总是先排序。确保您的数据有效。