- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 Ramda sortWith 按多列(升序或降序)对深度嵌套的对象数组进行排序时遇到问题。显然,排序是区分大小写的,并且导致以小写字母开头的值被放置到排序数组的最末尾。
首先,我导入必要的 ramda 函数:
import { sortWith, path, useWith, split, ascend, descend } from 'ramda'
然后我有这个数组:
const theList = [
{
name: 'A',
purchase: {
period: {
start: '2020-01-08T21:00:00Z',
end: '3070-10-27T21:00:00Z',
},
},
},
{
name: 'b',
purchase: {
period: {
start: '2019-09-30T19:00:00Z',
end: '3070-10-27T21:00:00Z',
},
},
},
{
name: 'C',
purchase: {
period: {
start: '2020-01-26T21:00:00Z',
end: '3070-10-27T21:00:00Z',
},
},
},
]
为了排序,我有这个带有规则的数组:
const sort = [
{ oder: 'asc', name: 'name' },
{ oder: 'desc', name: 'purchase.period.start' },
]
最后,我尝试使用给定的规则集对该数组进行排序:
const sortFunctions = sort.map(({ order, name }) => (
(order === 'asc')
? ascend(useWith(path, [split('.')])(name))
: descend(useWith(path, [split('.')])(name))
))
return sortWith(sortFunctions)(theList)
但是结果如下:
[
{
"name": "b",
"purchase": {
"period": {
"start": "2019-09-30T19:00:00Z",
"end": "3070-10-27T21:00:00Z"
}
}
},
{
"name": "C",
"purchase": {
"period": {
"start": "2020-01-26T21:00:00Z",
"end": "3070-10-27T21:00:00Z"
}
}
},
{
"name": "A",
"purchase": {
"period": {
"start": "2020-01-08T21:00:00Z",
"end": "3070-10-27T21:00:00Z"
}
}
}
]
所以这里的问题是 b
没有像预期的那样位于中间,因为它考虑了区分大小写。不仅如此,该列表的顺序似乎也与预期顺序相反。
我在这里做错了什么以及如何让它忽略区分大小写?
最佳答案
通过稍微修改代码版本(使用管道而不是 useWith
,我更愿意尽可能避免),我们可以在像这样的比较器:
const makeSorter = compose (
sortWith,
map (({order, name}) => (order == 'desc' ? descend : ascend) (
compose (toLower, path (split ('.', name)))
))
)
const sorts = [
{ order: 'asc', name: 'name' },
{ order: 'desc', name: 'purchase.period.start' },
]
// Switched the order to make the sorting clear
const theList = [{name: "C", purchase: {period: {start: "2020-01-26T21: 00: 00Z", end: "3070-10-27T21: 00: 00Z"}}}, {name: "A", purchase: {period: {start: "2020-01-08T21: 00: 00Z", end: "3070-10-27T21: 00: 00Z"}}}, {name: "b", purchase: {period: {start: "2019-09-30T19: 00: 00Z", end: "3070-10-27T21: 00: 00Z"}}}]
console .log (
makeSorter (sorts) (theList)
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
<script> const {compose, sortWith, map, ascend, descend, toLower, path, split} = R </script>
我还将测试从 asc
更改为 desc
因为我使用过类似的东西,其中 asc
是默认值,并且该字段是选修的。 (desc
在需要时是强制性的。)
这只是避免了我们传递给 ascend
或 descend
的函数中的一些重复:
(order == 'desc' ? descend : ascend)
我还没有测试这实际上适用于多种排序,因为这些值在“名称”上都不一致,但看起来应该有效。
关于javascript - 使用 ramda sortWith 进行不区分大小写的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60492229/
给定 Tuple2 的列表,我想对它们进行排序,以便其中一个的第二个元素是下一个的第一个元素。我试过用 sortWith 来做,但它在某些情况下有效,但在其他情况下无效。谁能看出我哪里搞砸了? Wel
我想按如下方式应用自定义排序比较器: myString.sortWith{ case (c1,c2) => c1.compareTo(c2) c1.compareTo(c2) val str =
我需要在 scala 上制作 java ArrayList 它是类、文件-字段的排序方法。要使用 ArrayList,我导入了 java.util.ArrayList 和 scala.collecti
我正在尝试对一组对象进行排序。 当我尝试使用 sortWith 函数只对对象中的一个字段进行排序时,它工作得很好。 当多个字段被排序时,它就会搞砸。 例如。 scala> val res = bran
我在使用 Ramda sortWith 按多列(升序或降序)对深度嵌套的对象数组进行排序时遇到问题。显然,排序是区分大小写的,并且导致以小写字母开头的值被放置到排序数组的最末尾。 首先,我导入必要的
我使用下面的 sortwith 方法对我的 ArrayList 进行排序,我想它会将订单号从小到大排序。比如10、9、8、7、6....0。但是结果不是我所期望的。请帮助解决这个问题。 company
我在 scala(2.11.8 和 2.12.1)中遇到 Seq[(Long, Double)] _._2) output >>> Seq[(Long, Double)] = List((11,11.
Scala 在标准库中包含了几种对列表进行排序的方法,例如对列表列表进行排序,可以使用: list.sorted list.sortWith(_x) 虽然这些可能是对列表进行排序的最简单方法,但我发现
我只是在探索 kotlin 集合,我观察到了一个重要的行为。 val sports = listOf( Sports("cricket", "7"), Sports("
我是一名优秀的程序员,十分优秀!