亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將URL參數轉換為JavaScript對象

將URL參數轉換為JavaScript對象

郎朗坤 2019-07-22 19:14:13
將URL參數轉換為JavaScript對象我有一根這樣的繩子:abc=foo&def=%5Basf%5D&xyz=5如何將其轉換為這樣的JavaScript對象?{   abc: 'foo',   def: '[asf]',   xyz: 5}
查看完整描述

3 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

編輯

此編輯改進并解釋了基于注釋的答案。

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

解析abc=foo&def=%5Basf%5D&xyz=5分五個步驟:

  • decdeURI:abc=foo&def=[asf]&xyz=5
  • 轉義引號:相同,因為沒有引號
  • 替換&:

    abc=foo","def=[asf]","xyz=5

  • 取代=:

    abc":"foo","def":"[asf]","xyz":"5

  • 有卷曲和引號:

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

這是合法的JSON。

改進解允許搜索字符串中的更多字符。它使用一個REVERVER函數對URI進行解碼:

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

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

施予

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

原始答案

單線:

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



查看完整回答
反對 回復 2019-07-22
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

從ES6和ON開始,Javascript提供了幾個構造,以便為這個問題創建一個可執行的解決方案。

這包括使用URLSearchParams迭代器

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

如果用例要求實際將其轉換為對象,則可以實現以下功能:

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

基本演示

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

使用Object.From Entry和Side

我們可以用Object.fromEntry(目前處于第4階段),paramsToObject帶著Object.fromEntries(entries).

因為URLParams返回可迭代對象,使用擴展算子而不是打電話.entries還將根據其規范生成條目:

要迭代的值對是列表名稱-值對,鍵是名稱,值是值。

const urlParams = new URLSearchParams('abc=foo&def=%5Basf%5D&xyz=5');const params = Object.fromEntries(...params); // {abc: "foo", def: "[asf]", xyz: "5"}

注:所有值都自動為字符串,按照URLSearchParams規范


查看完整回答
反對 回復 2019-07-22
?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

裂開&若要獲取名稱/值對,請將每對拆分為=..下面是一個例子:

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;}, {});

另一種方法是使用正則表達式:

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

這是從約翰·雷西格的作品中改編而來的“搜索而不替換”.


查看完整回答
反對 回復 2019-07-22
  • 3 回答
  • 0 關注
  • 2190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號