【发布时间】:2017-10-17 18:21:10
【问题描述】:
我想对我的 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 和 k 开头的名称。这是为什么呢?
好吧,如果这是难以解决的问题,那也不是问题。只要它可以对数字和字符串进行排序。
还有一点需要注意的是,我使用的是 Angular 4.4.4。我搜索了一个内置的 sort/orderBy 函数,但发现它不是内置的。但是,如果我可以使用 Angular 提供的任何东西来简化它,我会很乐意使用它!
编辑:
我的新方法:
sortAsc = (propertyName) => (a, b) => a[propertyName].localeCompare(b[propertyName]);
【问题讨论】:
-
比较字符串时您可能想使用
String#localeCompare。这还允许您配置小写/大写单词的排序方式。 -
v和k可能区分大小写。我在某些数据库上似乎有类似的问题,其中小写a被认为是在大写Z之后。也许尝试在你的比较函数中.toLower()? -
看起来它工作得很好。默认情况下,字符串不等式使用 unicode 代码点(包括 ASCII),因此按降序排列,您有小写字母,然后是大写字母。
-
这不是您的问题,但您绝对应该将 sortDesc 实现为 -1 * sortAsc(...) 而不是复制。
-
请以 JSON 格式发布您的实际数据(或重现问题所需的数据子集)。一个 gif 是不够的。
标签: javascript angular sorting ecmascript-6