Obtener cookie por nombre


362

Tengo un captador para obtener el valor de una cookie.

Ahora tengo 2 cookies por el nombre shares=y por el nombre obligations=.

Quiero hacer que este captador solo obtenga los valores de la cookie de obligaciones.

¿Cómo hago esto? Entonces, fordivide los datos en valores separados y los coloca en una matriz.

 function getCookie1() {
    // What do I have to add here to look only in the "obligations=" cookie? 
    // Because now it searches all the cookies.

    var elements = document.cookie.split('=');
    var obligations= elements[1].split('%');
    for (var i = 0; i < obligations.length - 1; i++) {
        var tmp = obligations[i].split('$');
        addProduct1(tmp[0], tmp[1], tmp[2], tmp[3]);
    }
 }

¿hay algo de resina que no sea solo una matriz?
webLacky3rdClass

haciendo que la cookie sea una matriz, debería decir.
webLacky3rdClass

No, ¿cómo podría hacer eso?


Es posible que desee aceptar una respuesta: su pregunta todavía está etiquetada como sin respuesta.
Soleil - Mathieu Prévot

Respuestas:


499

Un enfoque, que evita iterar sobre una matriz, sería:

function getCookie(name) {
  const value = `; ${document.cookie}`;
  const parts = value.split(`; ${name}=`);
  if (parts.length === 2) return parts.pop().split(';').shift();
}

Tutorial

Dividir una cadena por un token producirá una matriz con una cadena (mismo valor), en caso de que el token no exista en una cadena, o una matriz con dos cadenas, en caso de que el token se encuentre en una cadena.

El primer elemento (izquierda) es la cadena de lo que estaba antes del token, y el segundo (derecha) es la cadena de lo que estaba después del token.

(NOTA: en caso de que la cadena comience con un token, el primer elemento es una cadena vacía)

Teniendo en cuenta que las cookies se almacenan de la siguiente manera:

"{name}={value}; {name}={value}; ..."

para recuperar un valor de cookie específico, solo necesitamos obtener una cadena que esté después de "; {name} =" y antes del siguiente ";". Antes de realizar cualquier procesamiento, anteponemos la cadena de cookies con ";", de modo que cada nombre de cookie, incluido el primero, esté encerrado con ";" y "=":

"; {name}={value}; {name}={value}; ..."

Ahora, primero podemos dividir por "; {name} =", y si el token se encuentra en una cadena de cookies (es decir, tenemos dos elementos), terminaremos con el segundo elemento como una cadena que comienza con nuestro valor de cookie. Luego sacamos eso de una matriz (es decir, pop) y repetimos el mismo proceso, pero ahora con ";" como un token, pero esta vez tirando de la cadena izquierda (es decir, shift) para obtener el valor real del token.


13
@ user3132564 intentó editar esto, pero en realidad es un comentario: este método devuelve el valor incorrecto cuando busca un sufijo de una cookie, si el valor de document.cookie es "Nombre = John" y llama a getCookie ("Nombre "), volverás a" John "aunque no haya ninguna cookie con ese nombre. Tampoco funciona si el nombre de una cookie es el sufijo de otra; si document.cookie es "Name = John; LastName = Doe", al llamar a split ("Name =") se devuelve una matriz con tres cadenas y el método no ' t devuelve el valor correcto para getCookie ("Nombre").
Dennis Jaheruddin

20
Advertencia sobre la implementación en esta respuesta: si hay más de una cookie con el mismo nombre, no se devolverá ningún valor de cookie. Por ejemplo, si hay una cookie llamada stackToken configurada para los dominios .stackexchange.com y programmers.stackexchange.com, entonces si llama a getCookie ("stackToken") no se devolverá ningún valor, parts.length será mayor que 2. Si sabe que todos los valores de cookies para el mismo nombre (pero diferente dominio y ruta) serán los mismos, consulte la respuesta aceptada aquí: stackoverflow.com/questions/5639346/…
jlpp

77
@DennisJaheruddin: parece que se solucionó el problema del sufijo.
Nathan JB

2
@ NathanJ.Brauer tienes razón. Se actualizó para resolver ese problema hace mucho tiempo, pero solo se hizo una nota en el registro de cambios, en lugar de en los comentarios.
kirlich

hay una falla de eso. Si el "nombre" de la cookie y subrayado en otro nombre similar, IE 10+también da un error. Por ejemplo: "user": "Joe", "user_name":"Doe"
BOZ

176

Preferiría usar una sola coincidencia de expresión regular en la cookie:

window.getCookie = function(name) {
  var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
  if (match) return match[2];
}

O bien, también podemos usarlo como una función, verifique el código a continuación.

function check_cookie_name(name) 
    {
      var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
      if (match) {
        console.log(match[2]);
      }
      else{
           console.log('--something went wrong---');
      }
   }

Mejorado gracias a Scott Jungwirth en los comentarios.


11
Esto puede tener coincidencias falsas si dos cookies tienen el mismo sufijo. Coincidirá con ambos xyz=valuey abcxyz=valuecuándo name = xyz.
Brent Washburne

3
unescape((document.cookie.match(key + '=([^;].+?)(;|$)') || [])[1] || '');Versión modificada de Glize / dom / Cookies
Valentin Podkamennyi

19
Actualice Regex para new RegExp('(^| )' + name + '=([^;]+)')evitar problemas planteados por @BrentWashburne. También hice una prueba jsperf para esto y la respuesta con los votos más altos, esta aparece un poco por encima, pero definitivamente es menos código y más fácil de seguir: jsperf.com/simple-get-cookie-by-name
Scott Jungwirth

55
@ScottJungwirth Sí, pero luego debe actualizar la declaración de devolución para devolver la coincidencia [2];
Joe

@ScottJungwirth ¿Por qué no new RegExp('(^|;)' + name + '=([^;]+)')? El namedetrás del inicio de una línea o punto y coma, ¿por qué un espacio ``?
junlin

89

use un script de obtención de cookies:

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

entonces llámalo:

var value = readCookie('obligations');

Robé el código anterior de la página de cookies quirksmode. deberías leerlo .


77
... que robó el código de W3schools. Guau. w3schools.com/js/js_cookies.asp
WillWam

Oye, al menos di crédito: p ¿también cómo sabes que ese era el original?
mkoryak

En general, es seguro asumir que W3S lo puso allí primero. Son el hogar de muchos novatos que codifican ctrl-c.
WillWam

En realidad, parece que es al revés :) Quirksmode es / fue un gran sitio para las peculiaridades del navegador y también hay una fuente allí. scottandrew.com
sunn0

Me encanta w3schools. probablemente la mejor plataforma para personas mayores
Ralph Dingus

56

Si usa jQuery, le recomiendo que use este complemento:

https://github.com/carhartl/jquery-cookie
https://github.com/carhartl/jquery-cookie/blob/master/jquery.cookie.js

<script type="text/javascript"
 src="//cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js">

Entonces puedes leer una cookie como esta:

var value = $.cookie("obligations");

También puedes escribir cookie:

$.cookie('obligations', 'new_value');
$.cookie('obligations', 'new_value', { expires: 14, path: '/' });

Eliminar cookie:

$.removeCookie('obligations');

1
No estoy seguro de por qué esta no ha sido votada como la mejor respuesta realmente. Sí, es jQuery y no javascript, pero al mismo tiempo lo es !!!!
Cozzbie

21
@Cozzbie probablemente incluya una biblioteca externa (agregando así otra solicitud http) para obtener un valor de cookie es una exageración innecesaria.
rahulserver

Recibo un error "Error de referencia no capturado: $ no está definido" en "$ .cookie". Aunque incluí todas las bibliotecas necesarias como jquery.min.js y la biblioteca sugerida en esta respuesta.
Adarsh ​​Singh

44

Los métodos en algunas de las otras respuestas que usan una expresión regular no cubren todos los casos, particularmente:

  1. Cuando la cookie es la última cookie. En este caso, no habrá punto y coma después del valor de la cookie.
  2. Cuando otro nombre de cookie termina con el nombre que se busca. Por ejemplo, está buscando la cookie llamada "one", y hay una cookie llamada "done".
  3. Cuando el nombre de la cookie incluye caracteres que no se interpretan como ellos mismos cuando se usan en una expresión regular a menos que estén precedidos por una barra diagonal inversa.

El siguiente método maneja estos casos:

function getCookie(name) {
    function escape(s) { return s.replace(/([.*+?\^${}()|\[\]\/\\])/g, '\\$1'); };
    var match = document.cookie.match(RegExp('(?:^|;\\s*)' + escape(name) + '=([^;]*)'));
    return match ? match[1] : null;
}

Esto regresará nullsi no se encuentra la cookie. Devolverá una cadena vacía si el valor de la cookie está vacío.

Notas:

  1. Esta función asume que los nombres de cookies distinguen entre mayúsculas y minúsculas .
  2. document.cookie- Cuando esto aparece en el lado derecho de una tarea, representa una cadena que contiene una lista de cookies separadas por punto y coma, que a su vez son name=valuepares. Parece que hay un solo espacio después de cada punto y coma.
  3. String.prototype.match()- Regresa nullcuando no se encuentra ninguna coincidencia. Devuelve una matriz cuando se encuentra una coincidencia, y el elemento en el índice [1]es el valor del primer grupo coincidente.

Notas de expresiones regulares:

  1. (?:xxxx) - forma un grupo no coincidente.
  2. ^ - coincide con el inicio de la cadena.
  3. | - separa patrones alternativos para el grupo.
  4. ;\\s* - coincide con un punto y coma seguido de cero o más caracteres de espacio en blanco.
  5. = - coincide con un signo igual.
  6. (xxxx) - forma un grupo coincidente.
  7. [^;]*- coincide con cero o más caracteres que no sean punto y coma. Esto significa que coincidirá con los caracteres hasta, pero sin incluir, un punto y coma o al final de la cadena.

44
Esta respuesta es la mejor y más corta función que funciona en todos los casos sin coincidencias falsas. También tiene la mejor explicación de cómo funciona. Sin embargo, la función de escape no se explica y creo que si el autor creara la cookie sabría si el nombre debe ser escapado o no. Así que preferiría ver una función más corta:function getCookie(name) { var match = document.cookie.match(RegExp('(?:^|;\\s*)' + name + '=([^;]*)')); return match ? match[1] : null; }
Jeff Baker,

Si se trata de una herramienta genérica, debería escapar del nombre o generar un error si el nombre no se puede incrustar directamente en la expresión regular. Las personas que conocen las limitaciones de su aplicación pueden eliminar la fuga o la guardia.
Joe Lapp

31

4 años después, ES6 versión más simple.

function getCookie(name) {
  let cookie = {};
  document.cookie.split(';').forEach(function(el) {
    let [k,v] = el.split('=');
    cookie[k.trim()] = v;
  })
  return cookie[name];
}

También he creado una esencia para usarlo como un Cookieobjeto. por ejemplo, Cookie.set(name,value)yCookie.get(name)

Esto lee todas las cookies en lugar de escanear. Está bien para una pequeña cantidad de cookies.


23

He modificado la función que Jonathan proporcionó aquí, mediante el uso de expresiones regulares puede obtener un valor de cookie por su nombre como este:

function getCookie(name){
    var pattern = RegExp(name + "=.[^;]*")
    var matched = document.cookie.match(pattern)
    if(matched){
        var cookie = matched[0].split('=')
        return cookie[1]
    }
    return false
}

Si devuelve una cadena vacía, significa que la cookie existe pero no tiene valor; si devuelve false, la cookie no existe. Espero que esto ayude.


Por curiosidad, ¿por qué no usaste varen la línea 3? matched = ...
Victorio Berra

Perdón por eso, olvidé escribirlo.
Mohyaddin Alaoddin

14

Aquí hay una guía para obtener una cookie con un nombre específico sin la necesidad de ninguna lib externa:

var cookie = ("; "+document.cookie).split("; YOUR_COOKIE_NAME=").pop().split(";").shift();

Esta respuesta se basa en la brillante solución de kirlich . El único compromiso de esta solución es que obtendrá una cadena vacía cuando la cookie no exista. Sin embargo, en la mayoría de los casos esto no debería ser un factor decisivo.


10

Sé que es una vieja pregunta, pero también me encontré con este problema. Solo para que conste, hay una pequeña API en la página web de desarrolladores de Mozilla .

Yoy puede obtener cualquier cookie por nombre usando solo JS. El código también es más limpio en mi humilde opinión (excepto por la larga línea, que estoy seguro de que puede solucionar fácilmente).

function getCookie(sKey) {
    if (!sKey) { return null; }
    return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
}

Como se indicó en los comentarios, tenga en cuenta que este método supone que la clave y el valor se codificaron usando encodeURIComponent (). Elimine decode & encodeURIComponent () si la clave y el valor de la cookie no estaban codificados.


1
Solo tenga en cuenta que el método asume que el nombre y el valor de la cookie se codificaron encodeURIComponent()cuando se configuró la cookie, lo que será cierto si usa la función complementaria para configurar la cookie, pero no siempre es el caso. prueba
John S

@JohnS Podríamos eliminar el decodeURIComponent, ¿verdad? (¿Si no lo usáramos para configurar la cookie?) ¿Seguiría funcionando?
NiCk Newman

Sí, acabo de quitar el decodeURI y esta expresión regular es un monstruo. Gracias Marc, votó!
NiCk Newman

10

Puede usar la biblioteca js-cookie para obtener y configurar cookies de JavaScript.

Incluir en tu HTML:

<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>

Para crear una cookie:

Cookies.set('name', 'value');

Para leer una cookie:

Cookies.get('name'); // => 'value'

8

Aquí hay una versión bastante corta

 function getCookie(n) {
    let a = `; ${document.cookie}`.match(`;\\s*${n}=([^;]+)`);
    return a ? a[1] : '';
}

Tenga en cuenta que hice uso de las cadenas de plantilla de ES6 para componer la expresión regex.


2
La mejor respuesta a partir de ahora. Utiliza las funciones de ES6. Es 2017 y la gente todavía usa var, +para concatenar, etc. -.- '
Elias Soares

@EliasSoares ¿Cuál es el problema de usar var?
mrReiha


No es un problema, pero usar let es una buena práctica, ya que tiene ventajas en muchas situaciones y casi ninguna desventaja
Elias Soares

7

Utilizar object.defineProperty

Con esto, puede acceder fácilmente a las cookies.

Object.defineProperty(window, "Cookies", {
    get: function() {
        return document.cookie.split(';').reduce(function(cookies, cookie) {
            cookies[cookie.split("=")[0]] = unescape(cookie.split("=")[1]);
            return cookies
        }, {});
    }
});

A partir de ahora solo puedes hacer:

alert( Cookies.obligations );

Esto también se actualizará automáticamente, por lo que si cambia una cookie, Cookiestambién cambiará.


2
¡Perfecto! excepto que no funcionará para los objetos que tienen algunos caracteres como guiones (como nombres de cookies), y cuando se dividen, los objetos tienen un espacio en blanco primero, así que voy cookies[(cookie.split("=")[0]).replace(/ /g,'')] = ... ¡¡Gracias!!
Samuel Elh

@Samuel Elh correcto, pero también puede usar .trim () en lugar de reemplazar (/ / g, '')
mtizziani

7

Kirlich dio una buena solución. Sin embargo, falla cuando hay dos valores de cookies con nombres similares, aquí hay una solución simple para esta situación:

function getCookie(name) {
  var value = "; " + document.cookie;
  var parts = value.split("; " + name + "=");
  if (parts.length >= 2) return parts.pop().split(";").shift();
}

6

siempre funciona bien:

function getCookie(cname) {
    var name = cname + "=",
        ca = document.cookie.split(';'),
        i,
        c,
        ca_length = ca.length;
    for (i = 0; i < ca_length; i += 1) {
        c = ca[i];
        while (c.charAt(0) === ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) !== -1) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}

function setCookie(variable, value, expires_seconds) {
    var d = new Date();
    d = new Date(d.getTime() + 1000 * expires_seconds);
    document.cookie = variable + '=' + value + '; expires=' + d.toGMTString() + ';';
}

No hay requisitos para jQuery ni nada. Puro viejo buen JavaScript.


6
function getCookie(name) {
    var pair = document.cookie.split('; ').find(x => x.startsWith(name+'='));
    if (pair)
       return pair.split('=')[1]
}

6

Función simple para Obtener cookie con nombre de cookie:

function getCookie(cn) {
    var name = cn+"=";
    var allCookie = decodeURIComponent(document.cookie).split(';');
    var cval = [];
    for(var i=0; i < allCookie.length; i++) {
        if (allCookie[i].trim().indexOf(name) == 0) {
            cval = allCookie[i].trim().split("=");
        }   
    }
    return (cval.length > 0) ? cval[1] : "";
}

6

Aparentemente, MDN nunca ha oído hablar de la clase de caracteres regex de límite de palabra \b, que coincide con contigua \w+que está delimitada a ambos lados con \W+:

getCookie = function(name) {
    var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
    return r ? r[1] : null;
};

var obligations = getCookie('obligations');

5

Me parece que podría dividir los pares clave-valor de cookies en una matriz y basar su búsqueda en eso:

var obligations = getCookieData("obligations");

Que ejecuta lo siguiente:

function getCookieData( name ) {
    var pairs = document.cookie.split("; "),
        count = pairs.length, parts; 
    while ( count-- ) {
        parts = pairs[count].split("=");
        if ( parts[0] === name )
            return parts[1];
    }
    return false;
}

Violín: http://jsfiddle.net/qFmPc/

O posiblemente incluso lo siguiente:

function getCookieData( name ) {
    var patrn = new RegExp( "^" + name + "=(.*?);" ),
        patr2 = new RegExp( " " + name + "=(.*?);" );
    if ( match = (document.cookie.match(patrn) || document.cookie.match(patr2)) )
        return match[1];
    return false;
}

1
¿Hay algún método para usar document.cookie.indexOf (nombre) y comparar?

@AndrejHefner Podría, aunque eso coincidiría con las subcadenas. Entonces, si tenía un nombre de cookie "foobar" y uno llamado "bar", puede confundir la "barra" en "foobar" con la tecla "barra".
Sampson

@AndrejHefner Consulte el método posterior, que debería ser más rápido, ya que verifica que la cadena coincida.
Sampson

1
El segundo método tiene un error en el que no encontrará el último valor de cookie ya que siempre busca un; al final. Una versión de corrección sería:function getCookieData( name ) { var patrn = new RegExp( "(?:^| )" + name + "=(.*?)(?:;|$)" ); if ( match = (document.cookie.match(patrn) )) return match[1]; return false; }
Oz Solomon el

5

En mis proyectos utilizo la siguiente función para acceder a las cookies por nombre

function getCookie(cookie) {
    return document.cookie.split(';').reduce(function(prev, c) {
        var arr = c.split('=');
        return (arr[0].trim() === cookie) ? arr[1] : prev;
    }, undefined);
}

4

Si solo necesita verificar si existe alguna cookie, simplemente haga esto:

document.cookie.split('logged=true').length == 2

si la cookie registrada = true existe, obtendrá 2, si no 1.

registrado = verdadero: cámbielo a usted nombre de cookie = valor, o simplemente un nombre


1
¿No sería más fácil de usar .indexOf() >= 0?
Vic Seedoubleyew

3

Ya hay buenas respuestas aquí para obtener la cookie. Sin embargo, esta es mi propia solución:

function getcookie(cookiename){
var cookiestring  = document.cookie;
var cookiearray = cookiestring.split(';');
for(var i =0 ; i < cookiearray.length ; ++i){ 
    if(cookiearray[i].trim().match('^'+cookiename+'=')){ 
        return cookiearray[i].replace(`${cookiename}=`,'').trim();
    }
} return null;
}

uso: `

     getcookie('session_id');
   // gets cookie with name session_id

3

establecido por javascript

document.cookie = 'cookiename=tesing';

pasa por jquery con el complemento jquery-cookie

var value = $.cookie("cookiename");

alert(value);

@cytsunny: esto se debe a que debe tener el complemento de cookies jquery para usar esto.
Alex Standiford

Wow ... qué información importante faltaba anteriormente ... Pero desde el enlace que proporcionó, parece que el propietario de la biblioteca decidió que es mejor que eliminen la dependencia de jquery.
cytsunny


2

Mi solución es esta:

function getCookieValue(cookieName) {
    var ca = document.cookie.split('; ');
    return _.find(ca, function (cookie) {
        return cookie.indexOf(cookieName) === 0;
    });
}

Esta función utiliza la función Underscorejs _.find. Devuelve indefinido si el nombre de la cookie no existe


2

Lo he hecho de esta manera. para que pueda acceder a un objeto para separar los valores. Con esto, puede pasar la cookie al padre y luego puede acceder a sus valores mediante las teclas como

var cookies=getCookieVal(mycookie);
alert(cookies.mykey);
function getCookieVal(parent) {
            var cookievalue = $.cookie(parent).split('&');
            var obj = {};
            $.each(cookievalue, function (i, v) {
                var key = v.substr(0, v.indexOf("="));
                var val = v.substr(v.indexOf("=") + 1, v.length);

                obj[key] = val;

            });
            return obj;
        }  

1

Un enfoque funcional para encontrar cookies existentes. Devuelve una matriz, por lo que admite múltiples ocurrencias del mismo nombre. No admite la coincidencia parcial de teclas, pero es trivial reemplazar el === en el filtro con una expresión regular.

function getCookie(needle) {
    return document.cookie.split(';').map(function(cookiestring) {
        cs = cookiestring.trim().split('=');

        if(cs.length === 2) {
            return {'name' : cs[0], 'value' : cs[1]};
        } else {
            return {'name' : '', 'value' : ''};
        }
    })
    .filter(function(cookieObject) { 
        return (cookieObject.name === needle);
    });
}

1

Simplemente use la siguiente función (un código javascript puro)

const getCookie = (name) => {
 const cookies = Object.assign({}, ...document.cookie.split('; ').map(cookie => {
    const name = cookie.split('=')[0];
    const value = cookie.split('=')[1];

    return {[name]: value};
  }));

  return cookies[name];
};

1

Obtenga la cookie por nombre, simplemente pase el nombre de la cookie a la siguiente función

function getCookie(cname) {
  var name = cname + "=";
  var decodedCookie = decodeURIComponent(document.cookie);
  var ca = decodedCookie.split(';');
  for(var i = 0; i <ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0) == ' ') {
      c = c.substring(1);
    }
    if (c.indexOf(name) == 0) {
      return c.substring(name.length, c.length);
    }
  }
  return "";
}

0

La siguiente función devolverá un key-valuepar de la cookie requerida, donde keyestá el nombre de la cookie y valueserá el valor de la cookie.

/**
 * Returns cookie key-value pair
 */
var getCookieByName = function(name) {
    var result = ['-1','-1'];
    if(name) {
        var cookieList = document.cookie.split(';');
        result = $.grep(cookieList,function(cookie) { 
            cookie = cookie.split('=')[0];
            return cookie == name;
        });
    }
    return result;
};

0

Ejemplo de cookies: ejemplo JS:

document.cookies = {
   create : function(key, value, time){
     if (time) {
         var date = new Date();
         date.setTime(date.getTime()+(time*24*60*60*1000));
         var expires = "; expires="+date.toGMTString();
     }
     else var expires = "";
     document.cookie = key+"="+value+expires+"; path=/";
   },
   erase : function(key){
     this.create(key,"",-1);
   },
   read : function(key){
     var keyX = key + "=";
     var ca = document.cookie.split(';');
     for(var i=0;i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
          if (c.indexOf(keyX) == 0) return   c.substring(keyX.length,c.length);
     }
     return null;
   }
}

Almacene matrices y objetos con json o xml

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.