it-swarm.com.de

Konvertieren Sie URL-Parameter in ein JavaScript-Objekt

Ich habe eine Zeichenfolge wie diese:

abc=foo&def=%5Basf%5D&xyz=5

Wie kann ich es in ein solches JavaScript-Objekt konvertieren?

{
  abc: 'foo',
  def: '[asf]',
  xyz: 5
}
146
Alex

Bearbeiten

Diese Bearbeitung verbessert und erklärt die Antwort anhand der Kommentare.

var search = location.search.substring(1);
JSON.parse('{"' + decodeURI(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}')

Beispiel

Analysieren Sie abc=foo&def=%5Basf%5D&xyz=5 in fünf Schritten:

  • decodeURI: abc = foo & def = [asf] & xyz = 5
  • Escape-Anführungszeichen: dasselbe, da es keine Anführungszeichen gibt 
  • & Ersetzen: abc=foo","def=[asf]","xyz=5
  • Ersetzen =: abc":"foo","def":"[asf]","xyz":"5
  • Umrundung mit Curlies und Zitaten: {"abc":"foo","def":"[asf]","xyz":"5"}

welches ist legal JSON.

Eine verbesserte Lösung erlaubt mehr Zeichen in der Suchzeichenfolge. Es verwendet eine Reviver-Funktion für die URI-Dekodierung:

var search = location.search.substring(1);
JSON.parse('{"' + search.replace(/&/g, '","').replace(/=/g,'":"') + '"}', function(key, value) { return key===""?value:decodeURIComponent(value) })

Beispiel  

search = "abc=foo&def=%5Basf%5D&xyz=5&foo=b%3Dar";

gibt

Object {abc: "foo", def: "[asf]", xyz: "5", foo: "b=ar"}

Ursprüngliche Antwort

Ein Einlage:

JSON.parse('{"' + decodeURI("abc=foo&def=%5Basf%5D&xyz=5".replace(/&/g, "\",\"").replace(/=/g,"\":\"")) + '"}')
269
Wolfgang Kuehn

Teilen Sie &, um Name/Wert-Paare zu erhalten, und teilen Sie dann jedes Paar nach =. Hier ist ein Beispiel:

var str = "abc=foo&def=%5Basf%5D&xy%5Bz=5"
var obj = str.split("&").reduce(function(prev, curr, i, arr) {
    var p = curr.split("=");
    prev[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
    return prev;
}, {});

Ein anderer Ansatz, der reguläre Ausdrücke verwendet:

var obj = {}; 
str.replace(/([^=&]+)=([^&]*)/g, function(m, key, value) {
    obj[decodeURIComponent(key)] = decodeURIComponent(value);
}); 

Dies ist angepasst an John Resigs "Suchen und nicht ersetzen" .

24
Wayne Burkett

2018 ES6/7/8 und Anflug

Ab ES6 bietet Javascript mehrere Konstrukte an, um eine performante Lösung für dieses Problem zu erstellen.

Dazu gehören URLSearchParams und Iteratoren

let params = new URLSearchParams('abc=foo&def=%5Basf%5D&xyz=5');
params.get("abc"); // "foo"

Sollte Ihr Anwendungsfall es erforderlich machen, dass Sie ihn tatsächlich in ein Objekt konvertieren, können Sie die folgende Funktion implementieren:

function paramsToObject(entries) {
  let result = {}
  for(let entry of entries) { // each 'entry' is a [key, value] tupple
    result[entry[0]] = entry[1];
  }
  return result;
}

Demo

let params = new URLSearchParams('abc=foo&def=%5Basf%5D&xyz=5');
let entries = params.entries(); //returns an iterator of decoded [key,value] tuples
paramsToObject(entries); //{abc:"foo",def:"[asf]",xyz:"5"}

Hinweis: Alle Werte sind automatisch Zeichenfolgen gemäß der URLSearchParams-Spezifikation

18
silicakes

Dies ist die einfache Version, natürlich möchten Sie einige Fehlerprüfungen hinzufügen:

var obj = {};
var pairs = queryString.split('&');
for(i in pairs){
    var split = pairs[i].split('=');
    obj[decodeURIComponent(split[0])] = decodeURIComponent(split[1]);
}
12
Justin Niessner

Ich habe $ .String.deparam die vollständigste vorgefertigte Lösung gefunden (kann geschachtelte Objekte usw.). Schauen Sie sich die Dokumentation an .

9
Daff

Eine prägnante Lösung:

location.search
  .slice(1)
  .split('&')
  .map(p => p.split('='))
  .reduce((obj, pair) => {
    const [key, value] = pair.map(decodeURIComponent);
    return ({ ...obj, [key]: value })
  }, {});
8
Clemens Helm

Eine andere Lösung basierend auf dem neuesten Standard von URLSearchParams ( https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams )

function getQueryParamsObject() {
  const searchParams = new URLSearchParams(location.search.slice(1));
  return searchParams
    ? _.fromPairs(Array.from(searchParams.entries()))
    : {};
}

Bitte beachten Sie, dass von dieser Lösung Gebrauch gemacht wird 

Array.from ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from )

und _.fromPairs ( https://lodash.com/docs#fromPairs ) von lodash der Einfachheit halber. 

Es sollte leicht sein, eine kompatible Lösung zu erstellen, da Sie auf searchParams.entries () Iterator zugreifen können.

8
Nickey

Ich hatte das gleiche Problem, probierte die Lösungen hier aus, aber keine davon funktionierte wirklich, da ich Arrays in den URL-Parametern hatte:

?param[]=5&param[]=8&othr_param=abc&param[]=string

So schrieb ich meine eigene JS-Funktion, die aus dem Parameter in URI ein Array macht:

/**
 * Creates an object from URL encoded data
 */
var createObjFromURI = function() {
    var uri = decodeURI(location.search.substr(1));
    var chunks = uri.split('&');
    var params = Object();

    for (var i=0; i < chunks.length ; i++) {
        var chunk = chunks[i].split('=');
        if(chunk[0].search("\\[\\]") !== -1) {
            if( typeof params[chunk[0]] === 'undefined' ) {
                params[chunk[0]] = [chunk[1]];

            } else {
                params[chunk[0]].Push(chunk[1]);
            }


        } else {
            params[chunk[0]] = chunk[1];
        }
    }

    return params;
}
6
pcigler

Die vorgeschlagenen Lösungen, die ich bisher gefunden habe, decken keine komplexeren Szenarien ab.

Ich musste eine Abfrage wie konvertieren 

https://random.url.com?Target=Offer&Method=findAll&filters%5Bhas_goals_enabled%5D%5BTRUE%5D=1&filters%5Bstatus%5D=active&fields%5B%5D=id&fields%5B%5D=name&fields%5B%5D=default_goal_name

in ein Objekt wie: 

{
    "Target": "Offer",
    "Method": "findAll",
    "fields": [
        "id",
        "name",
        "default_goal_name"
    ],
    "filters": {
        "has_goals_enabled": {
            "TRUE": "1"
        },
        "status": "active"
    }
}

ODER:

https://random.url.com?Target=Report&Method=getStats&fields%5B%5D=Offer.name&fields%5B%5D=Advertiser.company&fields%5B%5D=Stat.clicks&fields%5B%5D=Stat.conversions&fields%5B%5D=Stat.cpa&fields%5B%5D=Stat.payout&fields%5B%5D=Stat.date&fields%5B%5D=Stat.offer_id&fields%5B%5D=Affiliate.company&groups%5B%5D=Stat.offer_id&groups%5B%5D=Stat.date&filters%5BStat.affiliate_id%5D%5Bconditional%5D=EQUAL_TO&filters%5BStat.affiliate_id%5D%5Bvalues%5D=1831&limit=9999

IN: 

{
    "Target": "Report",
    "Method": "getStats",
    "fields": [
        "Offer.name",
        "Advertiser.company",
        "Stat.clicks",
        "Stat.conversions",
        "Stat.cpa",
        "Stat.payout",
        "Stat.date",
        "Stat.offer_id",
        "Affiliate.company"
    ],
    "groups": [
        "Stat.offer_id",
        "Stat.date"
    ],
    "limit": "9999",
    "filters": {
        "Stat.affiliate_id": {
            "conditional": "EQUAL_TO",
            "values": "1831"
        }
    }
}

Ich habe mehrere Lösungen zu einer Lösung zusammengestellt und angepasst, die tatsächlich funktioniert:

CODE:

var getParamsAsObject = function (query) {

    query = query.substring(query.indexOf('?') + 1);

    var re = /([^&=]+)=?([^&]*)/g;
    var decodeRE = /\+/g;

    var decode = function (str) {
        return decodeURIComponent(str.replace(decodeRE, " "));
    };

    var params = {}, e;
    while (e = re.exec(query)) {
        var k = decode(e[1]), v = decode(e[2]);
        if (k.substring(k.length - 2) === '[]') {
            k = k.substring(0, k.length - 2);
            (params[k] || (params[k] = [])).Push(v);
        }
        else params[k] = v;
    }

    var assign = function (obj, keyPath, value) {
        var lastKeyIndex = keyPath.length - 1;
        for (var i = 0; i < lastKeyIndex; ++i) {
            var key = keyPath[i];
            if (!(key in obj))
                obj[key] = {}
            obj = obj[key];
        }
        obj[keyPath[lastKeyIndex]] = value;
    }

    for (var prop in params) {
        var structure = prop.split('[');
        if (structure.length > 1) {
            var levels = [];
            structure.forEach(function (item, i) {
                var key = item.replace(/[?[\]\\ ]/g, '');
                levels.Push(key);
            });
            assign(params, levels, params[prop]);
            delete(params[prop]);
        }
    }
    return params;
};

Verwendung von ES6, URL-API und URLSearchParams-API.

function objectifyQueryString(url) {
  let _url = new URL(url);
  let _params = new URLSearchParams(_url.search);
  let query = Array.from(_params.keys()).reduce((sum, value)=>{
    return Object.assign({[value]: _params.get(value)}, sum);
  }, {});
  return query;
}
5
supergentle

ES6 ein Liner (wenn wir es so nennen können, wenn man die lange Leitung sieht)

[...new URLSearchParams(location.search).entries()].reduce((prev, [key,val]) => {prev[key] = val; return prev}, {})

4
fadomire

ES6 ein Liner. Sauber und einfach.

var obj = [...new URLSearchParams(location.search).entries()].reduce((sum, [key,val]) => Object.assign({[key]:val}, sum), {});
3
rturkek

2019 Ein-Linien-Ansatz

Für Ihren speziellen Fall:

Object.fromEntries(new URLSearchParams('abc=foo&def=%5Basf%5D&xyz=5'));

Für den allgemeineren Fall, dass jemand Abfrageparameter für ein Objekt analysieren möchte:

Object.fromEntries(new URLSearchParams(location.search));

Wenn Sie Object.fromEntries nicht verwenden können, funktioniert dies auch:

Array.from(new URLSearchParams(window.location.search)).reduce((o, i) => ({ ...o, [i[0]]: i[1] }), {});
3
David Hansen

Es gibt keine native Lösung, die mir bekannt ist. Dojo verfügt über eine integrierte Methode zur Deserialisierung, wenn Sie dieses Framework zufällig verwenden.

Ansonsten können Sie es ganz einfach selbst implementieren:

function unserialize(str) {
  str = decodeURIComponent(str);
  var chunks = str.split('&'),
      obj = {};
  for(var c=0; c < chunks.length; c++) {
    var split = chunks[c].split('=', 2);
    obj[split[0]] = split[1];
  }
  return obj;
}

edit: hinzugefügt decodeURIComponent ()

2
mattacular

Phpjs verwenden

function parse_str(str, array) {
  //       discuss at: http://phpjs.org/functions/parse_str/
  //      original by: Cagri Ekin
  //      improved by: Michael White (http://getsprink.com)
  //      improved by: Jack
  //      improved by: Brett Zamir (http://brett-zamir.me)
  //      bugfixed by: Onno Marsman
  //      bugfixed by: Brett Zamir (http://brett-zamir.me)
  //      bugfixed by: stag019
  //      bugfixed by: Brett Zamir (http://brett-zamir.me)
  //      bugfixed by: MIO_KODUKI (http://mio-koduki.blogspot.com/)
  // reimplemented by: stag019
  //         input by: Dreamer
  //         input by: Zaide (http://zaidesthings.com/)
  //         input by: David Pesta (http://davidpesta.com/)
  //         input by: jeicquest
  //             note: When no argument is specified, will put variables in global scope.
  //             note: When a particular argument has been passed, and the returned value is different parse_str of PHP. For example, a=b=c&d====c
  //             test: skip
  //        example 1: var arr = {};
  //        example 1: parse_str('first=foo&second=bar', arr);
  //        example 1: $result = arr
  //        returns 1: { first: 'foo', second: 'bar' }
  //        example 2: var arr = {};
  //        example 2: parse_str('str_a=Jack+and+Jill+didn%27t+see+the+well.', arr);
  //        example 2: $result = arr
  //        returns 2: { str_a: "Jack and Jill didn't see the well." }
  //        example 3: var abc = {3:'a'};
  //        example 3: parse_str('abc[a][b]["c"]=def&abc[q]=t+5');
  //        returns 3: {"3":"a","a":{"b":{"c":"def"}},"q":"t 5"}

  var strArr = String(str)
    .replace(/^&/, '')
    .replace(/&$/, '')
    .split('&'),
    sal = strArr.length,
    i, j, ct, p, lastObj, obj, lastIter, undef, chr, tmp, key, value,
    postLeftBracketPos, keys, keysLen,
    fixStr = function(str) {
      return decodeURIComponent(str.replace(/\+/g, '%20'));
    };

  if (!array) {
    array = this.window;
  }

  for (i = 0; i < sal; i++) {
    tmp = strArr[i].split('=');
    key = fixStr(tmp[0]);
    value = (tmp.length < 2) ? '' : fixStr(tmp[1]);

    while (key.charAt(0) === ' ') {
      key = key.slice(1);
    }
    if (key.indexOf('\x00') > -1) {
      key = key.slice(0, key.indexOf('\x00'));
    }
    if (key && key.charAt(0) !== '[') {
      keys = [];
      postLeftBracketPos = 0;
      for (j = 0; j < key.length; j++) {
        if (key.charAt(j) === '[' && !postLeftBracketPos) {
          postLeftBracketPos = j + 1;
        } else if (key.charAt(j) === ']') {
          if (postLeftBracketPos) {
            if (!keys.length) {
              keys.Push(key.slice(0, postLeftBracketPos - 1));
            }
            keys.Push(key.substr(postLeftBracketPos, j - postLeftBracketPos));
            postLeftBracketPos = 0;
            if (key.charAt(j + 1) !== '[') {
              break;
            }
          }
        }
      }
      if (!keys.length) {
        keys = [key];
      }
      for (j = 0; j < keys[0].length; j++) {
        chr = keys[0].charAt(j);
        if (chr === ' ' || chr === '.' || chr === '[') {
          keys[0] = keys[0].substr(0, j) + '_' + keys[0].substr(j + 1);
        }
        if (chr === '[') {
          break;
        }
      }

      obj = array;
      for (j = 0, keysLen = keys.length; j < keysLen; j++) {
        key = keys[j].replace(/^['"]/, '')
          .replace(/['"]$/, '');
        lastIter = j !== keys.length - 1;
        lastObj = obj;
        if ((key !== '' && key !== ' ') || j === 0) {
          if (obj[key] === undef) {
            obj[key] = {};
          }
          obj = obj[key];
        } else { // To insert new dimension
          ct = -1;
          for (p in obj) {
            if (obj.hasOwnProperty(p)) {
              if (+p > ct && p.match(/^\d+$/g)) {
                ct = +p;
              }
            }
          }
          key = ct + 1;
        }
      }
      lastObj[key] = value;
    }
  }
}
2
Duy Hoang

Ziemlich einfach mit der URLSearchParams JavaScript Web API, 

var paramsString = "q=forum&topic=api";

//returns an iterator object
var searchParams = new URLSearchParams(paramsString);

//Usage
for (let p of searchParams) {
  console.log(p);
}

//Get the query strings
console.log(searchParams.toString());

//You can also pass in objects

var paramsObject = {q:"forum",topic:"api"}

//returns an iterator object
var searchParams = new URLSearchParams(paramsObject);

//Usage
for (let p of searchParams) {
  console.log(p);
}

//Get the query strings
console.log(searchParams.toString());

Nützliche Links

NOTE: Nicht unterstützt in IE}

2
Erisan Olasheni

Es gibt eine leichtgewichtige Bibliothek namens YouAreI.js , die getestet wurde und dies sehr einfach macht.

YouAreI = require('YouAreI')
uri = new YouAreI('http://user:[email protected]:3000/a/b/c?d=dad&e=1&f=12.3#fragment');

uri.query_get() => { d: 'dad', e: '1', f: '12.3' }
2
steel

Dies scheint die beste Lösung zu sein, da mehrere Parameter desselben Namens berücksichtigt werden.

    function paramsToJSON(str) {
        var pairs = str.split('&');
        var result = {};
        pairs.forEach(function(pair) {
            pair = pair.split('=');
            var name = pair[0]
            var value = pair[1]
            if( name.length )
                if (result[name] !== undefined) {
                    if (!result[name].Push) {
                        result[name] = [result[name]];
                    }
                    result[name].Push(value || '');
                } else {
                    result[name] = value || '';
                }
        });
        return( result );
    }

<a href="index.html?x=1&x=2&x=3&y=blah">something</a>
paramsToJSON("x=1&x=2&x=3&y=blah"); 

console yields => {x: Array[3], y: "blah"} where x is an array as is proper JSON

Ich beschloss später, es auch in ein jQuery-Plugin umzuwandeln ...

$.fn.serializeURLParams = function() {
    var result = {};

    if( !this.is("a") || this.attr("href").indexOf("?") == -1 ) 
        return( result );

    var pairs = this.attr("href").split("?")[1].split('&');
    pairs.forEach(function(pair) {
        pair = pair.split('=');
        var name = decodeURI(pair[0])
        var value = decodeURI(pair[1])
        if( name.length )
            if (result[name] !== undefined) {
                if (!result[name].Push) {
                    result[name] = [result[name]];
                }
                result[name].Push(value || '');
            } else {
                result[name] = value || '';
            }
    });
    return( result )
}

<a href="index.html?x=1&x=2&x=3&y=blah">something</a>
$("a").serializeURLParams(); 

console yields => {x: Array[3], y: "blah"} where x is an array as is proper JSON

Das erste akzeptiert nur die Parameter, aber das jQuery-Plugin nimmt die gesamte URL und gibt die serialisierten Parameter zurück.

1
jQuery Junkie

Hier ist meine schnelle und schmutzige Version. Im Wesentlichen werden die durch '&' getrennten URL-Parameter in Array-Elemente aufgeteilt. Anschließend durchläuft dieses Array mehrere durch '=' getrennte Schlüssel/Wert-Paare in ein Objekt. Ich verwende decodeURIComponent (), um die codierten Zeichen in ihre normalen Zeichenkettenäquivalente zu übersetzen (% 20 wird zu einem Leerzeichen,% 26 wird zu "&" usw.):

function deparam(paramStr) {
    let paramArr = paramStr.split('&');     
    let paramObj = {};
    paramArr.forEach(e=>{
        let param = e.split('=');
        paramObj[param[0]] = decodeURIComponent(param[1]);
    });
    return paramObj;
}

beispiel: 

deparam('abc=foo&def=%5Basf%5D&xyz=5')

kehrt zurück

{
    abc: "foo"
    def:"[asf]"
    xyz :"5"
}

Das einzige Problem ist, dass xyz eine Zeichenfolge und keine Zahl ist (aufgrund der Verwendung von decodeURIComponent ()), aber darüber hinaus kein schlechter Startpunkt.

1
Eric
//under ES6 
const getUrlParamAsObject = (url = window.location.href) => {
    let searchParams = url.split('?')[1];
    const result = {};
    //in case the queryString is empty
    if (searchParams!==undefined) {
        const paramParts = searchParams.split('&');
        for(let part of paramParts) {
            let paramValuePair = part.split('=');
            //exclude the case when the param has no value
            if(paramValuePair.length===2) {
                result[paramValuePair[0]] = decodeURIComponent(paramValuePair[1]);
            }
        }

    }
    return result;
}
1
XYz Amos

Wenn Sie URI.js verwenden, können Sie Folgendes verwenden:

https://medialize.github.io/URI.js/docs.html#static-parseQuery

var result = URI.parseQuery("?foo=bar&hello=world&hello=mars&bam=&yup");
result === {
  foo: "bar",
  hello: ["world", "mars"],
  bam: "",
  yup: null
};
1
tom10271

Hier ist eine, die ich benutze:

var params = {};
window.location.search.substring(1).split('&').forEach(function(pair) {
  pair = pair.split('=');
  if (pair[1] !== undefined) {
    var key = decodeURIComponent(pair[0]),
        val = decodeURIComponent(pair[1]),
        val = val ? val.replace(/\++/g,' ').trim() : '';

    if (key.length === 0) {
      return;
    }
    if (params[key] === undefined) {
      params[key] = val;
    }
    else {
      if ("function" !== typeof params[key].Push) {
        params[key] = [params[key]];
      }
      params[key].Push(val);
    }
  }
});
console.log(params);

Grundlegende Verwendung, z.
?a=aa&b=bb
Object {a: "aa", b: "bb"}

Doppelte Params, z.
?a=aa&b=bb&c=cc&c=potato
Object {a: "aa", b: "bb", c: ["cc","potato"]}

Fehlende Schlüssel, z.
?a=aa&b=bb&=cc
Object {a: "aa", b: "bb"}

Fehlende Werte, z.
?a=aa&b=bb&c
Object {a: "aa", b: "bb"}

Die obigen JSON/Regex-Lösungen werfen einen Syntaxfehler in dieser verrückten URL:
?a=aa&b=bb&c=&=dd&e
Object {a: "aa", b: "bb", c: ""}

1
Mike Causer

Ich musste mich auch mit + im Abfrageteil der URL befassen ( decodeURIComponent nicht ), also habe ich Wolfgang's Code angepasst: 

var search = location.search.substring(1);
search = search?JSON.parse('{"' + search.replace(/\+/g, ' ').replace(/&/g, '","').replace(/=/g,'":"') + '"}',
             function(key, value) { return key===""?value:decodeURIComponent(value)}):{};

In meinem Fall verwende ich jQuery, um URL-ready-Formularparameter abzurufen. Dieser Trick dient dazu, ein Objekt daraus zu erstellen, und ich kann dann problemlos Parameter für das Objekt aktualisieren und die Abfrage-URL neu erstellen, z. 

var objForm = JSON.parse('{"' + $myForm.serialize().replace(/\+/g, ' ').replace(/&/g, '","').replace(/=/g,'":"') + '"}',
             function(key, value) { return key===""?value:decodeURIComponent(value)});
objForm.anyParam += stringToAddToTheParam;
var serializedForm = $.param(objForm);
0
dlauzon

Für Node können Sie Folgendes verwenden:

const querystring = require('querystring');

querystring.parse('abc=foo&def=%5Basf%5D&xyz=5&foo=b%3Dar');
// returns the object

Dokumentation: https://nodejs.org/api/querystring.html

0
etoxin

Aufbauend auf Mike Causers Antwort Ich habe diese Funktion gemacht, die mehrere Parameter mit derselben Taste (foo=bar&foo=baz) sowie durch Kommas getrennte Parameter (foo=bar,baz,bin) berücksichtigt. Sie können auch nach einem bestimmten Abfrageschlüssel suchen.

function getQueryParams(queryKey) {
    var queryString = window.location.search;
    var query = {};
    var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');
    for (var i = 0; i < pairs.length; i++) {
        var pair = pairs[i].split('=');
        var key = decodeURIComponent(pair[0]);
        var value = decodeURIComponent(pair[1] || '');
        // Se possui uma vírgula no valor, converter em um array
        value = (value.indexOf(',') === -1 ? value : value.split(','));

        // Se a key já existe, tratar ela como um array
        if (query[key]) {
            if (query[key].constructor === Array) {
                // Array.concat() faz merge se o valor inserido for um array
                query[key] = query[key].concat(value);
            } else {
                // Se não for um array, criar um array contendo o valor anterior e o novo valor
                query[key] = [query[key], value];
            }
        } else {
            query[key] = value;
        }
    }

    if (typeof queryKey === 'undefined') {
        return query;
    } else {
        return query[queryKey];
    }
}

Beispieleingabe: foo.html?foo=bar&foo=baz&foo=bez,boz,buz&bar=1,2,3

Beispielausgabe

{
    foo: ["bar","baz","bez","boz","buz"],
    bar: ["1","2","3"]
}
0
Gus

Zuerst müssen Sie definieren, was ein Get VAR ist:

function getVar()
{
    this.length = 0;
    this.keys = [];
    this.Push = function(key, value)
    {
        if(key=="") key = this.length++;
        this[key] = value;
        this.keys.Push(key);
        return this[key];
    }
}

Dann lesen Sie einfach:

function urlElement()
{
    var thisPrototype = window.location;
    for(var prototypeI in thisPrototype) this[prototypeI] = thisPrototype[prototypeI];
    this.Variables = new getVar();
    if(!this.search) return this;
    var variables = this.search.replace(/\?/g,'').split('&');
    for(var varI=0; varI<variables.length; varI++)
    {
        var nameval = variables[varI].split('=');
        var name = nameval[0].replace(/\]/g,'').split('[');
        var pVariable = this.Variables;
        for(var nameI=0;nameI<name.length;nameI++)
        {
            if(name.length-1==nameI) pVariable.Push(name[nameI],nameval[1]);
            else var pVariable = (typeof pVariable[name[nameI]] != 'object')? pVariable.Push(name[nameI],new getVar()) : pVariable[name[nameI]];
        }
    }
}

und verwenden wie:

var mlocation = new urlElement();
mlocation = mlocation.Variables;
for(var key=0;key<mlocation.keys.length;key++)
{
    console.log(key);
    console.log(mlocation[mlocation.keys[key]];
}
0
Ag.