2010-11-28 3 views
20

Je dois faire un tableau JavaScript à partir de l'URL, par exemple:faire un tableau JavaScript à partir URL

tour ceci:

http://maps.google.com/maps/api/staticmap?center=Baker Street 221b, London&size=450x450&markers=Baker Street 221b, London&sensor=false 

en quelque chose comme:

array['center'] = Baker Street 221b, London 
array['size'] = 450x450 
// and so on... 

je dois faire cette sérialisation/désérialisation fonctionne dans les deux sens (url à array et array à la partie de l'url). Y a-t-il des fonctions intégrées qui font cela?

Merci d'avance! URL

+0

double possible: http://stackoverflow.com/questions/2090551/parse-query-string-in-javascript Cette autre question ne discute pas sérialisation (seulement désérialisation). – strager

+1

Ce n'est pas vraiment un ** tableau **, c'est un ** objet ** avec des propriétés. La notation est correcte mais la terminologie est désactivée, en d'autres termes. – Pointy

+1

@Pointy: C'est vrai, mais je pense en fait que "array (associative)" est plus lisible que "object" et fait passer le point. – casablanca

Répondre

40

à tableau: (adapté de my answer here)

function URLToArray(url) { 
    var request = {}; 
    var pairs = url.substring(url.indexOf('?') + 1).split('&'); 
    for (var i = 0; i < pairs.length; i++) { 
     if(!pairs[i]) 
      continue; 
     var pair = pairs[i].split('='); 
     request[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]); 
    } 
    return request; 
} 

Tableau à l'URL:

function ArrayToURL(array) { 
    var pairs = []; 
    for (var key in array) 
    if (array.hasOwnProperty(key)) 

     pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(array[key])); 
    return pairs.join('&'); 
} 
+0

Je n'ai pas besoin d'analyser l'emplacement mais une variable contenant l'URL. J'ai essayé de l'exécuter (avec l'emplacement remplacé par le nom de la variable) et il "se bloque" sur cette ligne var paires = location.search.substring (1) .split ('&'); – skazhy

+0

@skazhy: J'ai modifié la fonction pour accepter un paramètre – casablanca

+0

merci, maintenant ça marche pour moi! :) – skazhy

2

la URLToArray fonction ci-dessus ne fonctionne pas lorsque la chaîne url a elem [] = 23 & elem [] = 56 .. voir ci-dessous la fonction adaptée ... espérons que cela fonctionne - pas 100% testé

function URLToArray(url) { 
     var request = {}; 
     var arr = []; 
     var pairs = url.substring(url.indexOf('?') + 1).split('&'); 
     for (var i = 0; i < pairs.length; i++) { 
      var pair = pairs[i].split('='); 

      //check we have an array here - add array numeric indexes so the key elem[] is not identical. 
      if(endsWith(decodeURIComponent(pair[0]), '[]')) { 
       var arrName = decodeURIComponent(pair[0]).substring(0, decodeURIComponent(pair[0]).length - 2); 
       if(!(arrName in arr)) { 
        arr.push(arrName); 
        arr[arrName] = []; 
       } 

       arr[arrName].push(decodeURIComponent(pair[1])); 
       request[arrName] = arr[arrName]; 
      } else { 
      request[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]); 
      } 
     } 
     return request; 
    } 

où endwith est tiré de here

function endsWith(str, suffix) { 
    return str.indexOf(suffix, str.length - suffix.length) !== -1; 
} 
Questions connexes