Curso de JavaScript desde cero

Proyecto 4: Funciones para iterar tablas

Capítulo 54: Funciones para iterar tablas - Proyecto 4

En esta ocasión te voy a enseñar a crear funciones preparadas para iterar cualquier tabla HTML con JavaScript.

Propiedades para iterar tablas

En JavaScript, tenemos unas propiedades muy útiles para trabajar con tablas. Se trata de rows y cells.

table.rows y table.cells - Obtener filas y columnas de tablas

Palabra del lenguaje nº 83 encontrada.
rows es una propiedad de tabla que devuelve la colección de todos los elementos <tr> (table row).
Palabra del lenguaje nº 84 encontrada.
cells es una propiedad de tabla que devuelve la colección de todos los elementos <th> y/o <td>.

Lo primero que tienes que hacer, es añadir este id a la etiqueta <table>. <id="tablaPaises">.

Con la propiedad de tabla rows, vamos a obtener una colección de los elementos <tr> de la tabla. Ya no necesitamos más los id en cada fila del capítulo anterior (fila1, fila2...). Los puedes borrar.

Finalmente, el documento html nos quedará así:

<table class="table table-primary table-bordered table-striped table-hover" id="tablaPaises">
	<thead class="table-success">
		<tr>
			<th>Número de país</th>
			<th>África</th>
			<th>América</th>
			<th>Asia</th>
			<th>Europa</th>
			<th>Oceanía</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<th>1</th>
			<td>Egipto</td>
			<td>México</td>
			<td>Bután</td>
			<td>Inglaterra</td>
			<td>Australia</td>
		</tr>
		<tr>
			<th>2</th>
			<td>Etiopía</td>
			<td>Argentina</td>
			<td>China</td>
			<td>España</td>
			<td>Micronesia</td>
		</tr>
		<tr>
			<th>3</th>
			<td>Marruecos</td>
			<td>Colombia</td>
			<td>Japón</td>
			<td>Italia</td>
			<td>Samoa</td>
		</tr>
		<tr>
			<th>4</th>
			<td>Libia</td>
			<td>Perú</td>
			<td>Turquía</td>
			<td>Dinamarca</td>
			<td>Nueva Zelanda</td>
		</tr>
	</tbody>
</table>

Primero, obtengamos la colección de <tr>.

let tabla = document.getElementById("tablaPaises");

console.log(tabla.rows);
HTMLCollection(5) [tr, tr, tr, tr, tr]
0: tr
1: tr
2: tr
3: tr
4: tr
length: 5
propiedad de tabla rows

Ahora, si desplegamos cada fila en la colección HTML, veremos que contiene cada una su propia colección de cells, celdas en español. Si desplegamos esta, veremos que contiene las celdas de esa misma fila.

propiedad de tabla cells

Obtengamos de esta forma un dato de la fila 4, por ejemplo Libia.

Obtenemos la tabla por id, seleccionamos la fila 4 con la propiedad rows y a partir de esa propiedad, accedemos a su colección de cells y el número de la posición.

let tabla = document.getElementById("tablaPaises");

console.log(tabla.rows[4].cells[1].innerHTML);
Libia
Ten en cuenta, que en este contexto, la fila 0 es la cabecera de la tabla.

Función para obtener los datos de una fila de tabla

Podemos crear una función que itere automáticamente la fila que queramos de cualquier tabla. Sin tener que escribir código específico para cada una.

Lo primero, será almacenar la tabla que queramos en una variable. Esto es fácil, puesto que le hemos dado un id.

let tabla = document.getElementById("tablaPaises");

Si tenemos varias tablas a las que queremos acceder, lo haremos con un id diferente en cada una y las iremos guardando en variables. Por ejemplo:

let tablaPaises = document.getElementById("tablaPaises");
			let tablaCiudades = document.getElementById("tablaCiudades");
			let tablaPueblos = document.getElementById("tablaPueblos");

Seguimos solo con la tabla de países, ignora el resto. Son solo para un ejemplo. Ahora, lo que haremos, es crear la función.

El primer parámetro, tabla es para indicar la variable de tabla que queramos utilizar con esta función.

El segundo parámetro, numeroFila es para indicar el número de fila que queremos iterar.

Creamos una variable (fila) para almacenar la fila. Con la propiedad rows, vamos a obtener el elemento <tr>; de la fila pasada por parámetro. La fila entera con sus etiquetas <th> y <td> dentro, pero, no la colección.

elemento tr de tabla

No hagas caso al error que me aparece en la consola de la imagen. Esto es porque he modificado la función para mostrarte el resultado.

Añadiendo a esta fila obtenida la propiedad cells, vamos a obtener la colección de elementos <th> y <td>. Puesto que las colecciones son iterables, lo tenemos muy bien para obtener cada valor de la fila con un bucle.

function muestraFila(tabla, numeroFila) {
let fila = tabla.rows[numeroFila].cells;
for (const celda of fila) {
	console.log(celda.innerHTML);
}
}

La declaración for of


Palabra del lenguaje nº 85 encontrada.
La declaración for of es una forma rápida de iterar elementos iterables como los array o las colecciones html.

Aquí tengo que explicar algo nuevo, la declaración for of. Tenía pensado dejarlo para la parte avanzada del curso, pero, como nos viene bien para la función, lo explico ya aquí y de paso aprendes algo más de JavaScript.

La declaración for of sencillamente, crea un bucle que se repite sobre objetos iterables como por ejemplo, arrays o colecciones. Hagamos una prueba con un array, así lo entenderás mejor.

let numeros = [0,2,4,8,16,32,64,128,256,512,1024];

for (let i of numeros) {
console.log(i);
}

De manera fácil, estamos iterando el array sin de principio a fin.

0
2
4
8
16
32
64
128
256
512
1024

Para que compares la diferencia entre la forma de for que hemos utilizado en el curso, te dejo aquí el equivalente:

let numeros = [0,2,4,8,16,32,64,128,256,512,1024];

for (let i = 0; i < numeros.length; i++) {
console.log(numeros[i]);
}

En este caso, he tenido que especificar un valor inicial para i, decirle hasta donde tiene que iterar, también que incremente el valor de i y en el console.log, le tengo que poner los corchetes para que vaya cambiando la posición en el array.

Pues ya sabes, para los elementos iterables que quieras iterar de principio a fin, es mejor utilizar un for of.

Ten cuidado con utilizar la palabra of. Esta no está reservada para el lenguaje y podemos hacer un uso confuso de ella, utilizándolo como identificador:

for (let of of numeros) {
console.log(of);
}

Después de este paréntesis, probemos a llamar a una fila de la tabla con esta nueva función:


// Almacenamos la tabla
let tabla = document.getElementById("tablaPaises");

// Llamamos a la función
muestraFila(tabla, 2);

// Itera e imprime la fila que queramos de una tabla
function muestraFila(tabla, numeroFila) {
let fila = tabla.rows[numeroFila].cells;
for (const celda of fila) {
	console.log(celda.innerHTML);
}
}
2
Etiopía
Argentina
China
España
Micronesia

Si nos ponemos quisquillosos, podemos decir que si la tabla lleva <th> al lado, como esta, nos van a aparecer esos datos, en el caso del ejemplo, un 2 que no pinta nada seguramente. Todo depende del propósito, de como está hecha la tabla, etc.

No te preocupes, tengo la solución. Vamos a escribir otra función, que obtenga solo los elementos <td> de las filas. Puesto que a cells no podemos decirle que obtenga solo esos elementos, se lo diremos con nuestro tan utilizado y explotado getELementsByTagName().

// Obtenemos la tabla
let tabla = document.getElementById("tablaPaises");

// Llamamos a la función
muestraFilaTd(tabla, 2);

// Se almacenan los elementos td de la fila
function muestraFilaTd(tabla, numeroFila) {
const fila = tabla.rows[numeroFila].getElementsByTagName("td");
for (const celda of fila) {
	console.log(celda.innerHTML);
}
}
Etiopía
Argentina
China
España
Micronesia

Función para iterar las columnas de una tabla en JavaScript

Para iterar las columnas de las tablas en JavaScript, podemos utilizar un bucle for convencional.

// Obtenemos la tabla
let tabla = document.getElementById("tablaPaises");

// Llamamos a la función
muestraColumna(tabla, 2);

// iteramos todas las filas obteniendo solo el elemento de numeroColumna de cada fila.
function muestraColumna(tabla, numeroColumna {
for (let i = 0, celda; i < tabla.rows.length;  i++) {
	const celda = tabla.rows[i].cells[numeroColumna]
	console.log(celda.innerHTML);
}
}
América
México
Argentina
Colombia
Perú

¿Te molesta no poder obtener la columna sin el elemento de la cabecera (América en el ejemplo)?

Nuevamente, hay solución. Vamos a modificar el valor de i, de un cero a un uno. Así omitiremos el elemento de la fila 0.

// Obtenemos la tabla
let tabla = document.getElementById("tablaPaises");

// Llamamos a la función
muestraColumna(tabla, 2);

// iteramos todas las filas obteniendo solo el elemento de numeroColumna de cada fila.
function muestraColumna(tabla, numeroColumna {
for (let i = 1, celda; i < tabla.rows.length;  i++) {
	const celda = tabla.rows[i].cells[numeroColumna]
	console.log(celda.innerHTML);
}
}
México
Argentina
Colombia
Perú

Ahora, me puedes decir, pero esto es muy poco profesional, esta función, no se adapta entonces a cualquier tabla. Tengo que estar modificándola. Otra vez más, hay solución. Añadir un tercer parámetro.

Sustituimos el valor de i con el parámetro inicio.

En la llamada, por ejemplo, si ponemos el valor 1 en el tercer parámetro, nos obtendrá la columna omitiendo la cabecera que está en la fila 0.

// Obtenemos la tabla
let tabla = document.getElementById("tablaPaises");

// Llamamos a la función
muestraColumna(tabla, 2, 1);

// iteramos todas las filas obteniendo solo el elemento de numeroColumna de cada fila.
function muestraColumna(tabla, numeroColumna, inicio) {
for (let i = inicio, celda; i < tabla.rows.length;  i++) {
	const celda = tabla.rows[i].cells[numeroColumna]
	console.log(celda.innerHTML);
}
}

Ejercicios de JavaScript

  1. Crea una tabla html con la aplicación web Tables Generator o escríbela. Esta tabla será del tamaño que quieras. Intenta obtener al menos una fila y una columna de esta tabla utilizando las funciones del capítulo.

La solución la encontrarás aquí: Haz click aquí.


Comentarios

Si te quedan dudas sobre el temario, sobre JavaScript o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.

Twitter

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.