Ir al contenido principal

Cómo funciona slice y splice en javascript.


Cómo funciona slice y splice en javascript.

Slice

Array.prototype.slice (start, end);

Antes que nada tenemos que comentar que el método "slice" no es destructivo, o sea que no modifica el array original, y nos devuelve un nuevo array con los valores buscados.

Slice recibe dos argumentos, inicio y final (final es optativo), y nos devuelve un array que contiene los elementos desde el indice que coincide con el parámetro "inicio" hasta indice que coincide con el parámetro "final -1" o sea que no incluye el elemento con el indice igual a "final".
Si el parámetro "final" no esta incluido entonces interpretará que queremos hasta el último elemento.

Si el valor de "inicio" es negativo, tomará la longitud del array y restará el valor de "inicio" para calcular el indice desde donde tomar los elementos.
De similar manera, si el final es negativo, tomará la longitud del array y restará el "final" para saber hasta qué indice debe tomar sin incluir este último.

Veamos todo esto con ejemplos:

Si tenemos el siguiente array:

   let a = [1, 2, 3, 4, 5];

Como sabemos los indices van desde 0 a 4 en este caso.

Al hacer esta consulta nos devuelve lo que esta marcado con la flecha (=>):

  - pedimos desde el indice 0 hasta el final:
  a.slice(0);
  => [1, 2, 3, 4, 5]

  - pedimos desde el indice 0 hasta el indice 1:
  a.slice(0, 1);
  => [1]

  - pedimos desde el indice 1 hasta el indice 3:
  a.slice(1, 3);
  => [2, 3]

  - pedimos desde el final, indice igual a "array.length - 1" o sea 5 - 1:
  a.slice(-1);
  => [5]

Es lo mismo que pedir  a.slice(4); pero nos puede servir cuando no conocemos con exactitud la cantidad de elementos totales en el array y necesitamos los ultimos n elementos.

 a.slice(-3);
  => [3, 4, 5]

Y como comprobamos que no es destructivo? con el siguiente ejemplo:

asignamos un array en x y el resultado de hacer el slice en y, luego los mostramos por pantalla.

var x = ["a", "b", "c"];
var y = x.slice(1, 2);

console.log(x);
=> ["a", "b", "c"]

console.log(y);
=> ["b"]

Splice

Array.prototype.splice (start, deleteCount [ , item1 [ , item2 [ , … ] ] ] );

Antes que nada tenemos que comentar que el método "splice" si es destructivo, o sea que modifica permanentemente el array original, y nos devuelve los valores eliminados.

Splice recibe varios argumentos, el primer parámetro es el indice de inicio, desde donde se realizará la operación.

El siguiente parametro nos sirve para indicar cuantos elementos se eliminaran desde el indice de inicio.

Los siguientes parametros son opcionales y cuando estan presentes "splice" los interpreta como nuevos elementos que se agregaran desde el indice de inicio.

Veamos todo esto más claramente con ejemplos:

Definimos un array a con [1, 2, 3, 4, 5]

  let a = [1, 2, 3, 4, 5];
  => [1, 2, 3, 4, 5]

para eliminar el último elemento, en este caso tiene el indice 4 podemos usar:
  a.splice(4)
  => [5]
 console.log(a);
  => [1, 2, 3, 4]

nos devuelve como salida un array con el elemento eliminado.

Si queremos agregar un elemento a la posicion 4 usariamos algo asi:
  a.splice(4, 0, 5)
  => []
 console.log(a);
  => [1, 2, 3, 4, 5]

en este caso agregamos el 5 en la posicion "4" y no eliminamos ningún elemento asi que le pasamos "0" como segundo parametro. Nos devuelve un array en blanco porque no se eliminó nada.

Ahora queremos agregar dos elementos a nuestro array, en este caso 6 y 7 desde el indice "5"
  a.splice(5, 0, 6, 7)
  => []
 console.log(a);
  => [1, 2, 3, 4, 5, 6, 7]

Como vimos en todos los ejemplos al mostrar el contenido de nuestro array "a", el uso de "splice" modifica nuestro array de origen, por lo que es destructivo.




Comentarios

Entradas populares de este blog

C: Conversiones de tipo (casting) en C...

El casting o simplemente cast  nos permite hacer una conversión explícita de un tipo de dato a otro, a criterio del programador siempre y cuando estos tipos sean compatibles. Este cast se realiza a través de un operador de conversión de tipos (type casting operator) y es un recurso a tener en cuenta ya que hay situaciones en que nos puede resultar de gran utilidad. Hacer uso de un cast es tan sencillo como poner (tipo de dato)  delante de la expresión o variable a convertir. Veamos un ejemplo: Declaramos una variable de tipo int con un identificador tan creativo como "a" y le realizamos diferentes cast a a para mostrarlo como si fuera un float, un double y un char en un printf. Lo que obtendríamos en pantalla sería lo siguiente: Donde tenemos el valor de nuestro a, a convertido en float y double (mostrándolo con 3 cifras decimales) y a convertido en char. Si vemos este último caso, al hacer la conversión de "a" a char toma a como el código ascii de

C: Ejemplos: Congruencia de Zeller (nivel básico) ...

La Congruencia de Zeller es un algoritmo que se atribuye al matemático alemán Julius Christian Johannes Zeller que vivió en el siglo XIX. Este algoritmo nos permite determinar el día de la semana que le corresponde a una fecha determinada del calendario Gregoriano. La fórmula que nosotros usaremos (con algunas modificaciones respecto de la original para poder usarla en  informática) es la siguiente: Donde h es el día de la semana (entre 0 y 6), J es año/100 (la centuria) y K es año mod 100 (el año de la centuria). Y hay que tener en cuenta que los meses de enero y febrero cuentan como el mes 13 y 14 del año anterior. Ahora que tenemos la fórmula, programemos el algoritmo en C mediante el uso de una función: Analicemos el código paso a paso: Tenemos en cuenta el caso de enero y febrero: Dijimos que estos meses corresponden a los meses 13 y 14 del año anterior por lo que los asignamos como corresponde (mes + 12 , que dará 13 para enero y 14 para febrero) y le rest

Algoritmos: Resolución de problemas y refinamientos en pseudocódigo...

En otras entradas, vimos las partes que debe tener nuestro algoritmo en pseudocódigo y las estructuras que utilizaremos para resolverlo. Ahora llega el turno de implementar todo en conjunto para dar origen a nuestra creación. Pero ¿cómo resolvemos un problema así? Para hacerlo, utilizaremos lo que llamamos refinamientos sucesivos. Este concepto consiste en dividir el problema en subproblemas más pequeños y a estos, a su vez, en otros más pequeños; y así sucesivamente hasta que la solución de los últimos sea trivial, sencillo de resolver. Luego usaremos todas las soluciones obtenidas para armar la solución de nuestro problema mayor. Este principio, tiene base en parte de la técnica divide and conquer (dependiendo de la traducción: "divide y vencerás") que es una de las muchas técnicas de resolución de algoritmos existentes. Como vemos, al dividir el problema en otros más pequeños y más fáciles de resolver, podemos pasar de un problema complicado a uno cuya solución es much