Ruby' group_by' -like哈希方法

时间:2016-07-13 10:15:51

标签: ruby hash

我需要一个Ruby函数,它将哈希作为输入(键是符号,值是数值的数组)并返回其关联数组具有相同第一个值的键列表。

以下是一个例子:

h={
  :k1 => [2,3,5,12],
  :k2 => [9,5,6,10],
  :k3 => [2,4,5, 8],
}

f(h) # should return [[:k1,:k3]] 

...因为2在与:k1 :k3 关联的两个数组中显示为相同的值。返回Object是一个数组数组(因为,几组键可以具有相同的数组第一个值)。

到目前为止,我只对数组进行了分组:

def f(h)
  h.values.group_by{|ary| ary.first}
end   

# returns {2=>[[2, 3, 5, 12], [2, 4, 5, 8]], 9=>[[9, 5, 6, 10]]}

3 个答案:

答案 0 :(得分:2)

为什么不使用group_by作为问题的标题建议:

h2 = h.group_by { |k, v| v.first }

这给你这样的东西:

{2=>[[:k1, [2, 3, 5, 12]], [:k3, [2, 4, 5, 8]]], 9=>[[:k2, [9, 5, 6, 10]]]}

然后您可以使用它进行进一步处理。只想要钥匙?

h3 = h2.values.map { |v| v.map(&:first) }

只想拥有多个密钥的人吗?

h3.reject { |v| v.length < 2 }

或直接在h2

h2.reject { |k, v| v.length < 2 }

答案 1 :(得分:1)

我想出了这个丑陋的事情:

h.inject({}) do |memo, (key, array)|
  memo[array[0]] ||= []
  memo[array[0]] << key
  memo
end.detect do |(key, values)|
  values.size > 1
end.last

它基本上以以下形式重新映射哈希:

{first_item_in_array => keys_that_contain_it}

或者,在我们的案例中:

{2=>[:k1, :k3]}

然后它只检测到第一对有多个匹配并返回它:

[:k1, :k3]

希望有所帮助!

答案 2 :(得分:0)

也许你可以使用这样的东西

/// <reference path="../../../../node_modules/reselect/src/reselect.d.ts"/>

import { connect } from 'react-redux';
import Actions from '../../redux/actions';
import { createSelector } from 'reselect';
import { MapDispatchToPropsObject } from 'react-redux';

import { SearchCity } from './index';

const mapStateToProps = (state) => ({
  places: state.searchPlaces,
});

const mapDispatchToProps: MapDispatchToPropsObject = {
  search: Actions.searchPlaces.searchPlace,
};

export default connect(mapStateToProps, mapDispatchToProps)(SearchCity);