我正在寻找一种更深思熟虑的方法来对一组对象进行排序。如果您可以根据要比较的值的数字位置对块进行排序,那么就没有这样的速记来根据给定字段比较对象:
test-data: reduce [
object [name: "A" value: 1]
object [name: "B" value: 3]
object [name: "C" value: 2]
]一种解决方案是扩展本机SORT函数以接受与对象字段相对应的WORD!参数。但是,这需要对语言进行更新,可能需要一段时间才能被接受。
我已经勾勒出了以下SORT-BY函数,它包含一个单词(对象字段)或一个块(一个应用于对象的表达式):
sort-by: func [series [block!] comparator [block! word!]][
forskip series 2 [
insert series either word? comparator [
all [
in series/1 :comparator
get in series/1 :comparator
]
][
use [object] compose [
object: first series
(comparator)
]
]
]
sort/skip series 2
head forall series [remove series]
]这并不理想-它遍历块,从每个对象中提取各自的值并将其添加到块中;对块进行排序;然后再次删除值。
sort-by test-data 'value
sort-by test-data 'name
sort-by test-data [object/value]
sort-by test-data [sine 50 * object/value]对这一做法有何看法,尤其是经济方面?甚至需要这样的功能..。
显然是缺乏一个下降/上升的转换-暗示在未来的修订。
发布于 2014-12-18 17:43:55
有什么原因不能在这里使用/COMPARE细化的类型吗?
下面是使用它的sort-by的一个工作示例:
sort-by: function [
series [block!]
comparator [block! word!]
][
sort/compare series func [`a `b] either word? comparator [
[`a/:comparator < `b/:comparator]
][
sortie: function [by] [
s: to-paren copy/deep comparator
forall s [
if all [path? s/1 s/1/1 = 'object] [s/1/1: by]
]
s
]
compose [(sortie '`a) < (sortie '`b)]
]
]https://codereview.stackexchange.com/questions/71891
复制相似问题