2010-07-13 21 views
5

Sto provando a creare array dalla variabile window.location.hash ma sto facendo errori.Creazione matrice da Window.location.hash

Il mio codice è:

 $.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); 

Grazie.

+1

Stai cercando di analizzare l'hash o la ricerca? window.location.search restituisce la parte dopo il? e prima del numero #, che è la parte che ha la chiave/i valori della stringa di query. – Andir

+0

@Andir - Non penso che sia così, perché l'OP ha rimosso il cancelletto. Poi di nuovo, a quanto pare ho già assunto troppo. – Kobi

+0

So che alcune implementazioni usano l'hash per cose come la cronologia e quant'altro, ma volevo eliminare la possibilità di un identificatore di posizione errato. – Andir

risposta

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 non supporta la seguente notazione:

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

Prova questa invece:

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

Ciò creerà una matrice, in cui ogni elemento ha una chiave e un valore, ad esempio:

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

Utilizzare un hash probabilmente rende più scene nel tuo caso, quindi è possibile chiamare form_data['age'], e non avrà a guardare se la matrice:

inizializzare form_data a un oggetto:

form_data = {}; 

aggiungere le chiavi direttamente ad esso:

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

Così il risultato è:

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

Anche questo non funzionerà; my_item sarà redecato ogni volta, quindi conterrà solo l'ultima coppia chiave/valore. –

+0

@no - no. Viene spostato nell'array 'form_data', che è sicuro assumere definito prima del ciclo. – Kobi

+1

come è sicuro assumere? Ho pensato che non fosse stato dichiarato. –

0

Non dichiarato form_data non è un oggetto, quindi non può avere alcun pro perties, quindi form_data[i] = ... avrà esito negativo. Esegui questo script in un browser decente e la console dovrebbe mostrarti un messaggio equivalente a ciò che ho appena detto.

modifica - no non lo farà perché la sintassi letterale dell'oggetto fittizio lo farà scattare prima come menziona Kobi. Entrambi i problemi dovrebbero essere risolti.

0

Ecco un esempio in base al seguente URL:

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

Grazie per il codice, ma devo accedere a variabili come questa: myArray ["foo"] in questo caso non posso. – mTuran

+0

mTuran: Il tuo codice originale, se funzionava, non l'avrebbe mai fatto. 'form_data', assumendo che fosse dichiarato, avrebbe proprietà numeriche, proprio come' myArray' di Andrew. Non c'era alcuna indicazione che le proprietà non numeriche fossero un prerequisito. E dov'è il "foo" che dovrebbe venire comunque? –

+0

Che cosa sta guidando questa decisione per fare riferimento ai valori tramite indice di stringa, come in myArray ["foo"], è il professor Smith? – a7drew

4

dare una prova:

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); 

... Naturalmente ho il sospetto che si può mancare la proprietà di ricerca, piuttosto che l'hash, ma non conosco il tuo caso d'uso specifico.

0

Oggetto perfetto.

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

Se non si sta ancora utilizzando #!si può cambiare a #

+0

L'hash $ ritorna come non definito. –

0

Per ottenere array associativo da url hash:

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; 
} 

Esempio URL

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

Risultato

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

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

Problemi correlati