2017-10-17 51 views
1

我想排序我的JSON输出。Javascript ES6自定义排序方法无法一直工作

我为我自己的排序方法,你可以在这里看到:

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]); 
+0

比较字符串时,您可能想使用['String#localeCompare'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare)。这也可以让你配置小写/大写单词的排序方式。 –

+0

'v'和'k'可能是区分大小写的东西。在某些数据库中,似乎有类似的问题,其中小写'a'被认为是大写的'Z'。也许尝试在比较函数中使用'.toLower()'? – Tor

+0

它看起来像工作得很好。默认情况下,字符串不等式使用unicode代码点(其中包含ASCII),所以按降序排列,您使用小写字母,然后使用大写字母。 –

回答

0

你可以使用与选项:

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' }); 
+0

这真的很好知道。我从未注意过之前的选择。然而,你有一个问题 - 数字没有'localeCompare'方法。使用'a [propertyName] .toString()。localeCompare()'似乎工作正常。 –

+0

对,字符串方法需要转换。 –

+0

我没有看到在通常的关系运算符上使用'localCompare'的好理由 - 它们在字符串上工作得很好。还要注意,'options'在ES6中是新的,并且在旧版浏览器中不起作用。 – Bergi

-1

我想你想的ID比较数字,所以你应该使用合适的排序功能,对于像数列:

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; 

另一种方法是调整你的表数据数组,ids应该是数字那里,而不是字符串,在这种情况下,你的排序功能也应该工作。

-1

您的比较功能完全正常。关系运算符可以在数字和字符串两种情况下工作,没有理由使用localeCompare

它的工作原理有点类似,但是当我对它进行排序时,它总是不能正确排序:它并不真正与ID一起工作。

看起来对象数组中的id属性是字符串,所以它们按字典顺序进行比较。让他们成为实际的数字,他们会被比作数字。

它在Naam上升序但是,首先按降序给出2个名称,以v开始& k。这是为什么?

在gif中很难看到,但看起来这两个奇怪的排序值是以一个空格开始的 - 它总是先排序。确保你的数据是有效的。

+0

嗨,感谢您的回答,但是它首先以v&k开头的原因是因为它们不是小写字母。将其更改为localeComare可解决该问题。我不知道我的身份证是否是字符串,我不这么认为,因为我把它们转换为这样的数字:'id: null'。我现在所做的是,我添加了一个新的数字排序方法:'(propertyName)=>(a,b)=> a [propertyName] - (b [propertyName]);'这可能不是最好的解决方案,但代码看起来很好,可维护,而且速度很快。 –

+0

这是一个TypeScript声明吗?我不认为这是一个演员 - 并且绝对不会发生在你分配实际值的地方(而不是'null')。 – Bergi

+0

是的,我认为它是TypeScript。嗯...所以,不是演员。那么它是在C#中:P我对TypeScript,Angular和ES6有点新。 –

相关问题