2010-07-13 6 views
5

J'essaie de créer un tableau à partir de la variable window.location.hash, mais je m'explique.Création d'un tableau à partir de Window.location.hash

Mon code est:

 $.each(window.location.hash.replace("#", "").split("&"), function (i, value) { 
      value = value.split("="); 

      var my_item = {value[0] : value[1]}; 
      form_data[i] = my_item; 
     }); 
     console.log(form_data); 

Merci.

+1

Etes-vous en train d'analyser le hachage ou la recherche? Window.location.search renvoie la partie après le? et avant le # qui est la partie qui a la clé de la chaîne de caractères/valeurs. – Andir

+0

@Andir - Je ne pense pas que ce soit le cas, parce que l'OP a supprimé le signe de hachage. Ensuite, apparemment, j'ai supposé déjà trop. – Kobi

+0

Je sais que certaines implémentations utilisent le hachage pour des choses comme l'histoire et autres joyeusetés, mais je voulais éliminer la possibilité d'un identifiant de localisation erroné. – Andir

Répondre

2
your code is correct only error is 

$.each(window.location.hash.replace("#", "").split("&"), function (i, value) { 
      value = value.split("="); 
      var _formItem={}; 
      var my_item={}; 
      my_item[value[0]]= value[1]; 
      form_data[i] = my_item; 
     }); 
2

JavaScript ne prend pas en charge la notation suivante:

var my_item = {value[0] : value[1]}; 

Essayez ceci:

var my_item = {}; 
my_item[value[0]] = value[1]; 

Cela va créer un tableau, où chaque élément a une clé et une valeur, par exemple:

[{name: jason}, {age: 23}, {location: pacific}] //array of single keys 

L'utilisation d'un hachage fait probablement plus de scène dans votre cas, vous pouvez appeler form_data['age'], et ne devra pas regarder si le tableau:

initialize form_data à un objet:

form_data = {}; 

Ajouter clés directement à lui:

form_data[value[0]] = value[1]; 

Le résultat est donc:

{name: jason, age: 23, location: pacific} //associative array with properties 
+0

Cela ne fonctionnera pas non plus; my_item sera redéclaré à chaque fois, donc il ne contiendra que la dernière paire clé/valeur. –

+0

@no - non. Il est poussé vers le tableau 'form_data', que l'on peut supposer défini avant la boucle. – Kobi

+1

comment est-ce sûr à assumer? J'ai supposé que ce n'était pas déclaré. –

0

Non déclaré form_data n'est pas un objet, donc il ne peut pas avoir de pro donc, form_data[i] = ... va échouer. Exécutez ce script dans un navigateur décent et la console devrait vous montrer un message équivalent à ce que je viens de dire.

éditer - non ce n'est pas le cas, car la syntaxe littérale de l'objet fictif trébuchera d'abord comme mentionné par Kobi. Les deux problèmes devraient être corrigés.

0

Voici un exemple basé sur l'URL suivante:

http://www.someUrl.com/Index.htm#foo=bob&moo=alice

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <title>hash me long time</title> 
</head> 
<body> 

    <p>Hello World!</p> 

    <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script> 
    <script type="text/javascript"> 

     $(function() { 

      var hash = window.location.hash.replace('#', '').split('&'); 
      var myArray = new Array(); 
      for (var x = 0; x < hash.length; x++) { 
       var itemArray = hash[x].split('='); 
       var item = new Object(); 
       item.key = itemArray[0]; 
       item.value = itemArray[1]; 
       myArray.push(item); 
      } 

      for (var x = 0; x < myArray.length; x++) 
       console.log(myArray[x].key + ' is ' + myArray[x].value); 

     }); 

    </script> 
</body> 
</html> 
+0

Merci pour le code mais je dois accéder à des variables comme ceci: myArray ["foo"] ce cas je ne peux pas. – mTuran

+0

mTuran: Votre code original, s'il avait fonctionné, n'aurait pas non plus fait ça. 'form_data', en supposant qu'il ait été déclaré, aurait des propriétés numériques, tout comme' myArray' d'Andrew. Il n'y avait aucune indication que les propriétés non numériques étaient une condition préalable. Et où est-ce que 'foo' est censé venir de toute façon? –

+0

Qu'est-ce qui motive cette décision de référencer les valeurs via l'index de chaîne, comme dans myArray ["foo"], est-ce le professeur Smith? – a7drew

4

pour cette solution:

var hash = window.location.hash.slice(1); 
var array = hash.split("&"); 

var values, form_data = {}; 

for (var i = 0; i < array.length; i += 1) { 
    values = array[i].split("="); 
    form_data[values[0]] = values[1]; 
} 

console.log(form_data); 

... Bien sûr, je pense que vous pouvez vouloir la propriété de recherche, plutôt que le hachage, mais je ne connais pas votre cas d'utilisation spécifique.

0

Objet parfait.

location.hash = location.hash ? location.hash : "#!"; 
$.each((location.hash ? location.hash.split("#!") : [""])[1].split("&"), (function() { 
y = this.split("="); 
$hash[y[0]] = y[1]; 
})); 

Si vous n'utilisez pas #!vous pouvez le modifier à #

+0

$ hash revient indéfini. –

0

Pour obtenir un tableau associatif de hachage url:

function readUrlHashParams() { 
    var result = {}; 
    var hashParam = window.location.hash.substring(1); 
    var params = hashParam.split("&"); 

    $.each(params, function (index, set) { 
     var paramSet = set.split("="); 
     if (typeof (paramSet[1]) !== "undefined") { 
      result[paramSet[0]] = decodeURIComponent(paramSet[1]); 
     } else { 
      result[paramSet[0]] = ""; 
     } 
    }); 
    return result; 
} 

Exemple URL

http://localhost/Index.html#Param1=test1&Param2=Test2&Param3=

Résultat

var test = readUrlHashParams(); 
console.log(test); 

Object {Param1: "test1", Param2: "Test2", Param3: ""}

Questions connexes