从key创建新的数组数组

时间:2016-09-15 11:03:57

标签: ruby-on-rails arrays ruby

我有一个数组:

[{
    "name": "Category 1",
    "entries": [{
        "question": "Question 1",
        "answer": "Answer 1"
    }, {
        "question": "Question 2",
        "answer": "Answer 2"
    }, {
        "question": "Question 3",
        "answer": "Answer 3"
    }]
}, {
    "name": "Category 2",
    "entries": [{
        "question": "Question 1",
        "answer": "Answer 1"
    }, {
        "question": "Question 2",
        "answer": "Answer 2"
    }, {
        "question": "Question 3",
        "answer": "Answer 3"
    }]
}]

我想要做的是创建一个仅包含条目的新数组。

所以我最终得到了这个:

[{
    "question": "Question 1",
    "answer": "Answer 1"
}, {
    "question": "Question 2",
    "answer": "Answer 2"
}, {
    "question": "Question 3",
    "answer": "Answer 3"
}, {
    "question": "Question 1",
    "answer": "Answer 1"
}, {
    "question": "Question 2",
    "answer": "Answer 2"
}, {
    "question": "Question 3",
    "answer": "Answer 3"
}]

在PHP中我只想推进一个新数组......但是在Ruby中可以使用group_bycollect来实现这个目标吗?

2 个答案:

答案 0 :(得分:7)

使用Enumerable#flat_map

array = [{
    "name": "Category 1",
    "entries": [{
        "question": "Question 1",
        "answer": "Answer 1"
    }, {
        "question": "Question 2",
        "answer": "Answer 2"
    }, {
        "question": "Question 3",
        "answer": "Answer 3"
    }]
}, {
    "name": "Category 2",
    "entries": [{
        "question": "Question 1",
        "answer": "Answer 1"
    }, {
        "question": "Question 2",
        "answer": "Answer 2"
    }, {
        "question": "Question 3",
        "answer": "Answer 3"
    }]
}]
array.flat_map { |hash| hash[:entries] }
   #=> [{:question=>"Question 1", :answer=>"Answer 1"},
   #  {:question=>"Question 2", :answer=>"Answer 2"},
   #  {:question=>"Question 3", :answer=>"Answer 3"},
   #  {:question=>"Question 1", :answer=>"Answer 1"},
   #  {:question=>"Question 2", :answer=>"Answer 2"},
   #  {:question=>"Question 3", :answer=>"Answer 3"}]

答案 1 :(得分:1)

mapflatten会为您提供所需的输出:

your_array.map {|hash| hash[:entries]}.flatten

#=> [{:question=>"Question 1", :answer=>"Answer 1"},
# {:question=>"Question 2", :answer=>"Answer 2"},
# {:question=>"Question 3", :answer=>"Answer 3"},
# {:question=>"Question 1", :answer=>"Answer 1"},
# {:question=>"Question 2", :answer=>"Answer 2"},
# {:question=>"Question 3", :answer=>"Answer 3"}]