gpt4 book ai didi

ruby - 对数组中的特定对象进行排序

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:42 25 4
gpt4 key购买 nike

我是 Ruby 的新手,希望只对我收藏中的某些项目进行排序。例如,如果我有以下数组。我只想对包含属性 type: 'sort'

的对象进行排序
   object = [{
type: 'sort',
id: 3
}, {
type: 'notsort',
id: 4
}, {
type: 'sort',
id: 1
}, {
type: 'sort',
id: 0
}
]

我需要命令直接映射到下面的id映射。

sortIdOrder = [0, 1, 3]

最终结果应该是这样的:

object = [{
type: 'notsort',
id: 4
}, {
type: 'sort',
id: 0
},{
type: 'sort',
id: 1
}, {
type: 'sort',
id: 3
}]

如您所见,数组是根据 sortIdOrderid 排序的。 notsort type 可以在结尾也可以在开头。

最佳答案

排序可能代价高昂,因此当所需顺序已知时不应进行排序,如此处所示。

我假设值 :id是独一无二的,因为如果不是的话,这个问题就没有意义了。

首先将散列分成要排序的和其余的。

sortees, nonsortees = object.partition { |h| h[:type] == 'sort' }
#=> [[{:type=>"sort", :id=>3}, {:type=>"sort", :id=>1}, {:type=>"sort", :id=>0}],
# [{:type=>"notsort", :id=>4}]]

所以

sortees
#=> [{:type=>"sort", :id=>3}, {:type=>"sort", :id=>1}, {:type=>"sort", :id=>0}]
nonsortees
#=> [{:type=>"notsort", :id=>4}]

我将把 sortees 的元素放在一起按照所需的顺序,然后将该数组与 nonsortees 连接起来, 将不需要排序的哈希放在最后。

我订购了 sortees 的元素通过使用一个键值对创建哈希 g[:id]=>g对于每个元素 g sortees 的(哈希) .这让我可以使用 Hash#values_at以指定的顺序提取所需的哈希值。

sortees.each_with_object({}) { |g,h| h[g[:id]] = g }.
values_at(*sortIdOrder).
concat(nonsortees)
#=> [{:type=>"sort", :id=>0}, {:type=>"sort", :id=>1}, {:type=>"sort", :id=>3},
# {:type=>"notsort", :id=>4}]

注意

sortees.each_with_object({}) { |g,h| h[g[:id]] = g }
#=> {3=>{:type=>"sort", :id=>3}, 1=>{:type=>"sort", :id=>1},
# 0=>{:type=>"sort", :id=>0}}

关于ruby - 对数组中的特定对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39584728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com