Javascript ES6自定义排序方法一直无法正常工作

时间:2017-10-17 18:21:11

标签: javascript angular sorting ecmascript-6

我想对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]);

3 个答案:

答案 0 :(得分:1)

您可以使用String#localeCompare选项:

  

localeCompare() 方法返回一个数字,指示引用字符串是在排序顺序之前还是之后或与给定字符串相同。

     

新的localesoptions参数允许应用程序指定应使用其排序顺序的语言,并自定义函数的行为。在忽略localesoptions参数的旧实现中,使用的语言环境和排序顺序完全取决于实现。

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中很难看到,但看起来这两个奇怪排序的值以空格开头 - 总是先排序。确保您的数据有效。