Это мой первый вопрос, так что будьте добры.
У меня есть массив значений года/месяца, который выглядит примерно так:
[["2012", "1"], ["2013", "3"], ["2013", "4"], ["2013", "3"]]
По сути, у меня есть активная запись rails, которая, когда я прохожу через мой массив, если год и месяц уже существуют, я не хочу создавать новую строку. Я хочу поместить данные в один из моих 4 столбцов в предыдущей существующей строке.
Таким образом, таблица может выглядеть так:
<table>
<tr>
<th>Month/Year</th>
<th>Sales</th>
<th>Tech Support</th>
<th>Management</th>
</tr>
<tr>
<td>Jan/12</td>
<td>10</td>
<td>%nbsp;</td>
<td> </td>
</tr>
<tr>
<td>Mar/13</td>
<td> </td>
<td>10</td>
<td> </td>
</tr>
<tr>
<td>Apr/13</td>
<td> </td>
<td>%nbsp;</td>
<td>10;</td>
</tr>
<tr>
<td>Mar/13</td>
<td>10</td>
<td>%nbsp;</td>
<td> </td>
</tr>
</table>
У меня есть инструкции, которые говорят мне, если это Sales, Tech Support или Managment, чтобы он знал, в какой столбец его включить, моя проблема.
По сути, я хочу, чтобы последняя строка Mar/13 говорила: "Эй, у вас уже есть строка Mar/13, это значение должно идти в один из столбцов (и данные таковы, что я никогда не буду повторять столбец).
Будет ли лучше работать, создав таблицу с идентификатором для TD в рельсах, которые соответствуют столбцу year/month/column, а затем назначит активную запись массиву javascript, который использует эти идентификаторы, чтобы поместить значения в использование innerHTML или есть ли более разумный способ сделать это?
Я бы рекомендовал группировать данные, прежде чем пытаться вывести любое из них в представление, используя данные, которые вы указали в комментарии, мы можем сделать что-то вроде:
data = [
{ name: 'John', year: 2012, month: 3, category: 'sales', total: 3 },
{ name: 'Jacob', year: 2013, month: 3, category: 'management', total: 3 },
{ name: 'Jingleheimer', year: 2013, month: 1, category: 'tech support', total: 5 },
{ name: 'Schmidt', year: 2013, month: 3, category: 'tech support', total: 3 }
]
grouped = data.group_by { |datum| [datum[:year], datum[:month]] }
# Ruby 2.4+
transformed = grouped.transform_values do |values|
values.each.with_object({}) do |value, result|
result.merge!("#{value[:category]} Name" => value[:name],
value[:category] => value[:total])
end
end
puts transformed.inspect
# => {[2012, 3]=>{"sales Name"=>"John", "sales"=>3},
# [2013, 3]=>{"management Name"=>"Jacob", "management"=>3,
# "tech support Name"=>"Schmidt", "tech support"=>3},
# [2013, 1]=>{"tech support Name"=>"Jingleheimer", "tech support"=>5}}
# Ruby < 2.4
transformed = grouped.map do |year_month, values|
[year_month, values.each.with_object({}) do |value, result|
result.merge!("#{value[:category]} Name" => value[:name],
value[:category] => value[:total])
end]
end.to_h
puts transformed.inspect
# => {[2012, 3]=>{"sales Name"=>"John", "sales"=>3},
# [2013, 3]=>{"management Name"=>"Jacob", "management"=>3,
# "tech support Name"=>"Schmidt", "tech support"=>3},
# [2013, 1]=>{"tech support Name"=>"Jingleheimer", "tech support"=>5}}
Затем вы можете просто перебрать этот новый хэш с массивом [year, month]
поскольку ключи и значения являются хешем category => total_for_category
и выводят их, как вам хотелось бы.
Essentially what I want is that last row of Mar/13 to say "hey you already have a Mar/13 row, this value should go into one of it's columns (and the data is such that I will never repeat a column.)
Вы имеете в виду, должны войти в одну из существующих строк?