2011-03-31 32 views
52

我有一個JavaScript對象,我需要將其扁平化爲一個字符串,以便我可以傳遞查詢字符串,我該怎麼做?即:平展javascript對象作爲查詢字符串傳遞

{ cost: 12345, insertBy: 'testUser' }將成爲cost=12345&insertBy=testUser

我不能使用jQuery AJAX調用這個電話,我知道我們可以使用和傳遞對象作爲data但不是在這種情況下。儘管如此,使用jQuery拼合成對象也是可以的。

謝謝。

+0

可能重複的[序號JSON來查詢在JavaScript/jQuery的字符串](http://stackoverflow.com/questions/3308846/serialize-json-to-query-string-in-javascript-jquery) – 2011-03-31 19:20:58

+0

請在發佈前搜索。這已被問及之前回答。 – 2011-03-31 19:21:08

+0

對不起,我一直在搜索「flatten」作爲關鍵字,並找不到它。謝謝。 – Saxman 2011-03-31 22:14:06

回答

64

你想​​:

var str = $.param({ cost: 12345, insertBy: 'testUser' }); 
// "cost=12345&insertBy=testUser" 

注意,這是jQuery的內部使用序列化作爲data參數傳遞對象的功能。

15

嘗試$.param()方法:

var result = $.param({ cost: 12345, insertBy: 'testUser' }); 
77

這裏有一個非jQuery的版本:

function toQueryString(obj) { 
    var parts = []; 
    for (var i in obj) { 
     if (obj.hasOwnProperty(i)) { 
      parts.push(encodeURIComponent(i) + "=" + encodeURIComponent(obj[i])); 
     } 
    } 
    return parts.join("&"); 
} 
+0

它工作的很棒! – yorch 2013-10-25 02:46:07

+0

當我嘗試它時,它使用參數號,而不是查詢的第一部分的名稱? Javascript使我瘋狂。 – 2014-06-13 01:03:38

+0

@ElectricLlama:你在使用數組嗎?你有一些示例代碼? – 2014-06-15 14:11:39

3
var myObj = { cost: 12345, insertBy: 'testUser' }, 
    param = '', 
    url = 'http://mysite.com/mypage.php';  

for (var p in myObj) { 
    if (myObj.hasOwnProperty(p)) { 
    param += encodeURIComponent(p) + "=" + encodeURIComponent(myObj[p]) + "&"; 
    } 
} 

window.location.href = url + "?" + param; 
+1

這個答案有一個錯誤,它會在最後一個'param'後面留下'&' – yorch 2013-10-25 02:45:28

3

一般的JavaScript:

function toParam(obj) { 
    var str = ""; 
    var seperator = ""; 
    for (key in obj) { 
    str += seperator; 
    str += enncodeURIComponent(key) + "=" + encodeURIComponent(obj[key]); 
    seperator = "&"; 
    } 
    return str; 
} 


toParam({ cost: 12345, insertBy: 'testUser' }) 
"cost=12345&insertBy=testUser" 
15

這裏是另一種非jQuery的版本,利用lodash或者如果您已經在使用一個下劃線那些圖書館:

var toQueryString = function(obj) { 
    return _.map(obj,function(v,k){ 
    return encodeURIComponent(k) + '=' + encodeURIComponent(v); 
    }).join('&'); 
}; 
12

This是一個古老的問題,但在谷歌搜索的頂部,所以我加入這個完整性。

如果1)你不希望用戶的jQuery,但2)要隱蔽一個嵌套對象的查詢字符串,然後(建設關添唐氏和蓋伊的回答)的,使用此:

function toQueryString(obj, urlEncode) { 
    // 
    // Helper function that flattens an object, retaining key structer as a path array: 
    // 
    // Input: { prop1: 'x', prop2: { y: 1, z: 2 } } 
    // Example output: [ 
    //  { path: [ 'prop1' ],  val: 'x' }, 
    //  { path: [ 'prop2', 'y' ], val: '1' }, 
    //  { path: [ 'prop2', 'z' ], val: '2' } 
    // ] 
    // 
    function flattenObj(x, path) { 
     var result = []; 

     path = path || []; 
     Object.keys(x).forEach(function (key) { 
      if (!x.hasOwnProperty(key)) return; 

      var newPath = path.slice(); 
      newPath.push(key); 

      var vals = []; 
      if (typeof x[key] == 'object') { 
       vals = flattenObj(x[key], newPath); 
      } else { 
       vals.push({ path: newPath, val: x[key] }); 
      } 
      vals.forEach(function (obj) { 
       return result.push(obj); 
      }); 
     }); 

     return result; 
    } // flattenObj 

    // start with flattening `obj` 
    var parts = flattenObj(obj); // [ { path: [ ...parts ], val: ... }, ... ] 

    // convert to array notation: 
    parts = parts.map(function (varInfo) { 
     if (varInfo.path.length == 1) varInfo.path = varInfo.path[0];else { 
      var first = varInfo.path[0]; 
      var rest = varInfo.path.slice(1); 
      varInfo.path = first + '[' + rest.join('][') + ']'; 
     } 
     return varInfo; 
    }); // parts.map 

    // join the parts to a query-string url-component 
    var queryString = parts.map(function (varInfo) { 
     return varInfo.path + '=' + varInfo.val; 
    }).join('&'); 
    if (urlEncode) return encodeURIComponent(queryString);else return queryString; 
} 

使用像:

console.log(toQueryString({ 
    prop1: 'x', 
    prop2: { 
     y: 1, 
     z: 2 
    } 
}, false)); 

,輸出:

prop1=x&prop2[y]=1&prop2[z]=2 
+0

謝謝,非常有用的代碼 – Alexey 2017-06-15 13:52:41

1

您可以使用的jsfiddle這個

function serialize(obj) 
{ 
    let str = [] 

    for(var p in obj) 
    { 
     if(obj.hasOwnProperty(p)) str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p])) 
    } 

    return str.join('&') 
} 

嘗試此鏈接https://jsfiddle.net/yussan/kwmnkca6/

30

我ES6版本(純JavaScript,沒有jQuery的):

function toQueryString(paramsObject) { 
    return Object 
    .keys(paramsObject) 
    .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(paramsObject[key])}`) 
    .join('&') 
    ; 
} 
+0

不錯,男士。 – victorkurauchi 2016-11-01 12:31:22

+0

感謝您的摘錄! – Mirage 2017-04-12 08:52:37

+1

太棒了!但是在調用'.map(...)'之前,我添加了'.filter(key => paramsObject [key]!== null)'(或其他),以防止包含空值 – Daria 2017-08-15 13:55:49

4

另一個版本:

function toQueryString(obj) { 
    return Object.keys(obj).map(k => { 
     return encodeURIComponent(k) + "=" + encodeURIComponent(obj[k]) 
    }) 
    .join("&"); 
} 
1

ES6版本Jrop's answer(也解析嵌套參數)

const toQueryString = (obj, urlEncode = false) => { 
    if (!obj) return null; 
    const flattenObj = (x, path = []) => { 
    const result = []; 
    Object.keys(x).forEach((key) => { 
     if (!Object.prototype.hasOwnProperty.call(x, key)) return; 
     const newPath = path.slice(); 
     newPath.push(key); 
     let vals = []; 
     if (typeof x[key] === 'object') { 
     vals = flattenObj(x[key], newPath); 
     } else { 
     vals.push({ path: newPath, val: x[key] }); 
     } 
     vals.forEach((v) => { 
     return result.push(v); 
     }); 
    }); 
    return result; 
    }; 

    let parts = flattenObj(obj); 
    parts = parts.map((varInfo) => { 
    if (varInfo.path.length === 1) { 
     varInfo.path = varInfo.path[0]; // eslint-disable-line no-param-reassign 
    } else { 
     const first = varInfo.path[0]; 
     const rest = varInfo.path.slice(1); 
     varInfo.path = `${first}[${rest.join('][')}]`; // eslint-disable-line no-param-reassign 
    } 
    return varInfo; 
    }); 

    const queryString = parts.map((varInfo) => { 
    return `${varInfo.path}=${varInfo.val}`; 
    }).join('&'); 
    if (urlEncode) { 
    return encodeURIComponent(queryString); 
    } 
    return queryString; 
}; 
+0

雖然此代碼可能回答問題,提供關於如何解決問題和/或爲什麼解決問題的附加背景可以提高答案的長期價值。請閱讀此[如何回答](http://stackoverflow.com/help/how-to-answer)以提供高質量的答案。 – thewaywewere 2017-06-25 15:15:34

相關問題