首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rebol的“'Sort By”函数

Rebol的“'Sort By”函数
EN

Code Review用户
提问于 2014-12-06 18:13:56
回答 1查看 176关注 0票数 4

我正在寻找一种更深思熟虑的方法来对一组对象进行排序。如果您可以根据要比较的值的数字位置对块进行排序,那么就没有这样的速记来根据给定字段比较对象:

代码语言:javascript
复制
test-data: reduce [
    object [name: "A" value: 1]
    object [name: "B" value: 3]
    object [name: "C" value: 2]
]

一种解决方案是扩展本机SORT函数以接受与对象字段相对应的WORD!参数。但是,这需要对语言进行更新,可能需要一段时间才能被接受。

我已经勾勒出了以下SORT-BY函数,它包含一个单词(对象字段)或一个块(一个应用于对象的表达式):

代码语言:javascript
复制
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]
]

这并不理想-它遍历块,从每个对象中提取各自的值并将其添加到块中;对块进行排序;然后再次删除值。

代码语言:javascript
复制
sort-by test-data 'value
sort-by test-data 'name
sort-by test-data [object/value]
sort-by test-data [sine 50 * object/value]

对这一做法有何看法,尤其是经济方面?甚至需要这样的功能..。

显然是缺乏一个下降/上升的转换-暗示在未来的修订。

EN

回答 1

Code Review用户

发布于 2014-12-18 17:43:55

有什么原因不能在这里使用/COMPARE细化的类型吗?

下面是使用它的sort-by的一个工作示例:

代码语言:javascript
复制
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)]
    ]
]
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/71891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档