486 Stimmen

Wie wandelt man URL-Parameter in ein JavaScript-Objekt um?

Ich habe einen String wie diesen:

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

Wie kann ich sie in ein JavaScript-Objekt wie dieses umwandeln?

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

1voto

XYz Amos Punkte 1323
//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;
}

1voto

Eric Punkte 503

Hier ist meine schnelle und schmutzige Version, im Grunde seine Aufteilung der URL-Parameter getrennt durch '&' in Array-Elemente, und dann iteriert über dieses Array hinzufügen Schlüssel/Wert-Paare getrennt durch '=' in ein Objekt. Ich verwende decodeURIComponent(), um die kodierten Zeichen in ihre normalen String-Äquivalente zu übersetzen (so %20 wird ein Leerzeichen, %26 wird '&', 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')

gibt zurück.

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

Das einzige Problem ist, dass xyz eine Zeichenkette und nicht eine Zahl ist (aufgrund der Verwendung von decodeURIComponent()), aber darüber hinaus ist es kein schlechter Ausgangspunkt.

1voto

ling Punkte 8381

Wenn Sie eine Rekursion benötigen, können Sie das kleine js-extension-ling Bibliothek.

npm i js-extension-ling

const jsx = require("js-extension-ling");

console.log(jsx.queryStringToObject("a=1")); 
console.log(jsx.queryStringToObject("a=1&a=3")); 
console.log(jsx.queryStringToObject("a[]=1")); 
console.log(jsx.queryStringToObject("a[]=1&a[]=pomme")); 
console.log(jsx.queryStringToObject("a[0]=one&a[1]=five"));
console.log(jsx.queryStringToObject("http://blabla?foo=bar&number=1234")); 
console.log(jsx.queryStringToObject("a[fruits][red][]=strawberry"));
console.log(jsx.queryStringToObject("a[fruits][red][]=strawberry&a[1]=five&a[fruits][red][]=cherry&a[fruits][yellow][]=lemon&a[fruits][yellow][688]=banana"));

Die Ausgabe sieht dann etwa so aus:

{ a: '1' }
{ a: '3' }
{ a: { '0': '1' } }
{ a: { '0': '1', '1': 'pomme' } }
{ a: { '0': 'one', '1': 'five' } }
{ foo: 'bar', number: '1234' }
{
  a: { fruits: { red: { '0': 'strawberry' } } }
}
{
  a: {
    '1': 'five',
    fruits: {
      red: { '0': 'strawberry', '1': 'cherry' },
      yellow: { '0': 'lemon', '688': 'banana' }
    }
  }
}

Hinweis: Es basiert auf der locutus parse_str Funktion ( https://locutus.io/php/strings/parse_str/ ).

0voto

Mr. Polywhirl Punkte 34960

Hier ist eine vereinfachte Version von Ansatz von Silikakuchen .

Die folgende(n) Funktion(en) kann (können) einen Querystring entweder aus einer USVString o Location .

/**
 * Returns a plain object representation of a URLSearchParams object.
 * @param {USVString} search - A URL querystring
 * @return {Object} a key-value pair object from a URL querystring
 */
const parseSearch = (search) =>
  [...new URLSearchParams(search).entries()]
    .reduce((acc, [key, val]) => ({
      ...acc,
      // eslint-disable-next-line no-nested-ternary
      [key]: Object.prototype.hasOwnProperty.call(acc, key)
        ? Array.isArray(acc[key])
          ? [...acc[key], val]
          : [acc[key], val]
        : val
    }), {});

/**
 * Returns a plain object representation of a URLSearchParams object.
 * @param {Location} location - Either a document or window location, or React useLocation()
 * @return {Object} a key-value pair object from a URL querystring
 */
const parseLocationSearch = (location) => parseSearch(location.search);

console.log(parseSearch('?foo=bar&x=y&ids=%5B1%2C2%2C3%5D&ids=%5B4%2C5%2C6%5D'));

.as-console-wrapper { top: 0; max-height: 100% !important; }

Hier ist ein Einzeiler des obigen Codes (125 Bytes):

Wo f es parseSearch

f=s=>[...new URLSearchParams(s).entries()].reduce((a,[k,v])=>({...a,[k]:a[k]?Array.isArray(a[k])?[...a[k],v]:[a[k],v]:v}),{})

bearbeiten

Hier ist eine Methode zur Serialisierung und Aktualisierung:

const parseSearch = (search) =>
  [...new URLSearchParams(search).entries()]
    .reduce((acc, [key, val]) => ({
      ...acc,
      // eslint-disable-next-line no-nested-ternary
      [key]: Object.prototype.hasOwnProperty.call(acc, key)
        ? Array.isArray(acc[key])
          ? [...acc[key], val]
          : [acc[key], val]
        : val
    }), {});

const toQueryString = (params) =>
  `?${Object.entries(params)
    .flatMap(([key, values]) =>
      Array.isArray(values)
        ? values.map(value => [key, value])
        : [[key, values]])
    .map(pair => pair.map(val => encodeURIComponent(val)).join('='))
    .join('&')}`;

const updateQueryString = (search, update) =>
  (parsed =>
    toQueryString(update instanceof Function
      ? update(parsed)
      : { ...parsed, ...update }))
  (parseSearch(search));

const queryString = '?foo=bar&x=y&ids=%5B1%2C2%2C3%5D&ids=%5B4%2C5%2C6%5D';
const parsedQuery = parseSearch(queryString);
console.log(parsedQuery);
console.log(toQueryString(parsedQuery) === queryString);

const updatedQuerySimple = updateQueryString(queryString, {
  foo: 'baz',
  x: 'z',
});
console.log(updatedQuerySimple);
console.log(parseSearch(updatedQuerySimple));

const updatedQuery = updateQueryString(updatedQuerySimple, parsed => ({
  ...parsed,
  ids: [
    ...parsed.ids,
    JSON.stringify([7,8,9])
  ]
}));
console.log(updatedQuery);
console.log(parseSearch(updatedQuery));

.as-console-wrapper { top: 0; max-height: 100% !important; }

0voto

dlauzon Punkte 986

Ich musste mich auch mit + im Abfrageteil der URL ( decodeURIComponent funktioniert nicht ), so dass ich Wolfgangs Code angepasst habe, um zu werden:

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-Formular-Parameter zu erhalten, dann dieser Trick, um ein Objekt daraus zu bauen und ich kann dann leicht aktualisieren Parameter auf das Objekt und die Abfrage-URL, z.B. neu zu erstellen:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X