Transformador de datos
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 56 de 56.
El desafío final: transformar un conjunto de datos en un informe de resumen. Combine el filtrado, el mapeo, el agrupamiento, el manejo de errores y la definición de métodos en un solo programa.
Desafío
IntermedioSe proporciona el arreglo students. Cada entrada es un hash con :id, :grades (un arreglo de enteros, posiblemente vacío) y :subjects (un arreglo de cadenas).
Define un método transform_dataset(students) que devuelva un hash con dos claves:
:qualified_ids: un arreglo ordenado de los:ids de los estudiantes que tienen al menos una calificación y todas sus calificaciones son estrictamente superiores a70(usaall?).:subject_counts: un hash que mapea cada asignatura cursada por los estudiantes calificados con el número de estudiantes calificados que la cursan.
Si el arreglo :grades de un estudiante está vacío, no está calificado, omítelo silenciosamente.
Luego llama al método e imprime:
- Los IDs calificados unidos por
,, con el prefijoQualified:. Si no hay ninguno, imprimeQualified: (none). - Una línea por asignatura (ordenada alfabéticamente) en el formato
<subject>: <count>.
Para el valor por defecto de students, la salida es:
Qualified: S1, S4
biology: 1
history: 1
math: 2
physics: 1Hoja de referencia
Combina filtrado, mapeo, agrupación y formateo de salida en Ruby:
def transform_dataset(students)
qualified = students.select do |s|
s[:grades].any? && s[:grades].all? { |g| g > 70 }
end
qualified_ids = qualified.map { |s| s[:id] }.sort
subject_counts = Hash.new(0)
qualified.each do |s|
s[:subjects].each { |subj| subject_counts[subj] += 1 }
end
{ qualified_ids: qualified_ids, subject_counts: subject_counts }
end
Imprime los resultados con valores de respaldo y claves ordenadas:
result = transform_dataset(students)
ids = result[:qualified_ids]
puts "Qualified: #{ids.any? ? ids.join(', ') : '(none)'}"
result[:subject_counts].sort.each do |subject, count|
puts "#{subject}: #{count}"
end
all?devuelvefalseen arreglos vacíos — usaany?primero para protegerte contra calificaciones vacías.Hash.new(0)inicializa las claves faltantes en0, lo cual es útil para contar..sorten un hash devuelve pares[key, value]ordenados alfabéticamente.
Pruébalo tú mismo
students = [
{ id: "S1", grades: [85, 92, 78], subjects: ["math", "physics"] },
{ id: "S2", grades: [65, 80, 90], subjects: ["math", "biology"] },
{ id: "S3", grades: [], subjects: ["art"] },
{ id: "S4", grades: [88, 95], subjects: ["math", "biology", "history"] },
{ id: "S5", grades: [70, 75], subjects: ["chemistry"] }
]
# TODO: def transform_dataset(students), devolver { qualified_ids:, subject_counts: }
# TODO: imprimir los IDs calificados y el conteo de asignaturas
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo
1Strings en profundidad
Visión general de los métodos de StringInterpolación de StringsIterar sobre StringsSplit y JoinRepaso - String Weaver4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end vs llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasResumen - Iterador personalizado7Hashes Parte 2
Hash.new con valores por defectoIteración de HashesHashes anidadosFusión y transformaciónResumen - Contador de frecuencia10Proyecto - Registros de Estudiantes
Descripción general del proyectoAgregar estudiante5Potencia de Enumerable
Select y RejectEncadenando MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byResumen - Data Pipeline