2010-07-13 10 views
5

Estoy tratando de crear una matriz desde la variable window.location.hash pero estoy fallando.Crear matriz desde Window.location.hash

Mi código es:

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

Gracias.

+1

¿Está intentando analizar el hash o la búsqueda? window.location.search devuelve la parte después del? y antes del # que es la parte que tiene la clave/valores de la cadena de consulta. – Andir

+0

@Andir - No creo que ese sea el caso, porque OP eliminó el signo de almohadilla. Por otra parte, aparentemente ya asumí demasiado. – Kobi

+0

Sé que algunas implementaciones usan el hash para cosas como history y whatnot, pero quería eliminar la posibilidad de un identificador de ubicación equivocado. – Andir

Respuesta

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 no admite la siguiente notación:

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

probar este lugar:

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

Esto creará una matriz, donde cada elemento tiene una clave y un valor, por ejemplo:

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

el uso de un hash probablemente tiene más escena en su caso, para que pueda llamar form_data['age'], y no tendrá que buscar bien la matriz:

inicializar form_data a un objeto:

form_data = {}; 

añadir claves directamente a ella:

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

Así, el resultado es:

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

Eso tampoco funcionará; my_item se volverá a declarar cada vez, por lo que solo contendrá el último par clave/valor. –

+0

@no - nope Se empuja a la matriz 'form_data', que es seguro suponer antes del ciclo. – Kobi

+1

¿cómo es seguro asumirlo? Supuse que no fue declarado. –

0

Undeclared form_data no es un objeto, por lo que no puede tener ningún pro perties, por lo que form_data[i] = ... fallará. Ejecute este script en un navegador decente y la consola debería mostrarle un mensaje que asciende a lo que acabo de decir.

editar - no, no lo hará porque la sintaxis literal del objeto falso la hará tropezar primero, como menciona Kobi. Ambas cuestiones deben ser corregidas.

0

Aquí hay una muestra basada en la siguiente 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

Gracias por el código pero tengo que acceder a variables como esta: myArray ["foo"] en este caso no puedo. – mTuran

+0

mTuran: Su código original, si hubiera funcionado, tampoco lo hubiera hecho. 'form_data', suponiendo que fue declarado, tendría propiedades numéricas, al igual que Andrew' myArray'. No había ninguna indicación de que las propiedades no numéricas fueran un requisito previo. ¿Y de dónde se supone que 'foo' debe venir? –

+0

¿Qué impulsa esta decisión a los valores de referencia a través del índice de cadenas, como en myArray ["foo"], ¿es el Profesor Smith? – a7drew

4

seguirlo:

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

... Por supuesto que sospecha que puede estar deseando la propiedad de búsqueda, en lugar de hash, pero no conozco su caso de uso específico.

0

Objeto perfecto.

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

¡Si aún no está usando #!se puede cambiar a #

+0

$ hash vuelve como indefinido. –

0

Para obtener matriz asociativa de hash de 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; 
} 

Ejemplo URL

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

Resultado

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

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

Cuestiones relacionadas