จะสร้างพารามิเตอร์การสืบค้นใน Javascript ได้อย่างไร?


133

มีวิธีใดในการสร้างพารามิเตอร์การสืบค้นสำหรับการส่งคำขอ GETใน JavaScript หรือไม่

เช่นเดียวกับใน Python ที่คุณมีurllib.urlencode()ซึ่งใช้ในพจนานุกรม (หรือรายการสองสิ่งสองตัว) และสร้างสตริงเช่น'var1=value1&var2=value2'.

คำตอบ:


189

ได้แล้ว:

function encodeQueryData(data) {
   const ret = [];
   for (let d in data)
     ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
   return ret.join('&');
}

การใช้งาน:

const data = { 'first name': 'George', 'last name': 'Jetson', 'age': 110 };
const querystring = encodeQueryData(data);

12
เมื่อทำซ้ำforให้ใช้hasOwnPropertyเพื่อให้แน่ใจว่าสามารถทำงานร่วมกันได้
troelskn

3
@troelskn จุดดี ... แม้ว่าในกรณีนี้ใครบางคนจะต้องขยาย Object.prototype เพื่อทำลายมันซึ่งเป็นความคิดที่ไม่ดีในการเริ่มต้น
Shog9

1
@ Shog9 ทำไมถึงเป็นไอเดียที่ไม่ดี?
Cesar Canassa


เป็นเพียงรายละเอียดเล็ก ๆ น้อย ๆ แต่อาจเป็น const ได้
Alkis Mavridis

86

URLSearchParamsเพิ่มการรองรับเบราว์เซอร์

const data = {
  var1: 'value1',
  var2: 'value2'
};

const searchParams = new URLSearchParams(data);

// searchParams.toString() === 'var1=value1&var2=value2'

Node.js มีโมดูลเคียวรีสตริง

const querystring = require('querystring');

const data = {
  var1: 'value1',
  var2: 'value2'
};

const searchParams = querystring.stringify(data);

// searchParams === 'var1=value1&var2=value2'

1
แนวทางที่สะอาดและทันสมัยอย่างแน่นอน คุณสามารถโทรได้อย่างอิสระในภายหลังsearchParams.append(otherData)
kano

81

การทำงาน

function encodeData(data) {
    return Object.keys(data).map(function(key) {
        return [key, data[key]].map(encodeURIComponent).join("=");
    }).join("&");
}   

1
ทำได้ดีนี่! .map () ถูกนำไปใช้ใน JavaScript 1.6 ดังนั้นเบราว์เซอร์เกือบทั้งหมดแม้แต่เบราว์เซอร์รุ่นยายก็รองรับ แต่อย่างที่คุณเดาได้ว่า IE ไม่ได้ยกเว้น IE 9+ แต่ไม่ต้องกังวลมีวิธีแก้ปัญหาชั่วคราว ที่มา: developer.mozilla.org/en-US/docs/JavaScript/Reference/…
Akseli Palén

var data = { bloop1: true, bloop2: "something" }; var url = "https://something.com/?"; var params = encodeData(data); var finalUrl = url + params; // Is this the right use?ควรผลิตhttps://www.something.com/?bloop1=true&bloop2=something?
dylanh724

1
@DylanHunt: Yup …
Przemek

38

Zabbaได้ให้ในความคิดเห็นในคำตอบที่ได้รับการยอมรับในขณะนี้ข้อเสนอแนะว่าให้ฉันเป็นทางออกที่ดีที่สุด: ใช้jQuery.param ()

หากฉันใช้jQuery.param()ข้อมูลในคำถามเดิมรหัสจะเป็นเพียง:

const params = jQuery.param({
    var1: 'value',
    var2: 'value'
});

ตัวแปรparamsจะเป็น

"var1=value&var2=value"

สำหรับตัวอย่างที่มีความซับซ้อนมากขึ้นปัจจัยการผลิตและผลผลิตดูjQuery.param ()เอกสาร


10

เราเพิ่งเปิดตัวarg.jsซึ่งเป็นโครงการที่มุ่งแก้ปัญหานี้ครั้งแล้วครั้งเล่า ตามเนื้อผ้ามันยากมาก แต่ตอนนี้คุณสามารถทำได้:

var querystring = Arg.url({name: "Mat", state: "CO"});

และการอ่านผลงาน:

var name = Arg("name");

หรือรับล็อตทั้งหมด:

var params = Arg.all();

และหากคุณสนใจเกี่ยวกับความแตกต่างระหว่าง?query=trueและ#hash=trueจากนั้นคุณสามารถใช้Arg.query()และArg.hash()วิธีการ


9

สิ่งนี้ควรทำงาน:

const createQueryParams = params => 
      Object.keys(params)
            .map(k => `${k}=${encodeURI(params[k])}`)
            .join('&');

ตัวอย่าง:

const params = { name : 'John', postcode: 'W1 2DL'}
const queryParams = createQueryParams(params)

ผลลัพธ์:

name=John&postcode=W1%202DL

1
หลังจากนั้นฉันก็รู้ว่ามันเป็นคำตอบของ @ manav ที่แตกต่างกันเล็กน้อยด้านล่าง อย่างไรก็ตามยังคงเป็นที่นิยมสำหรับไวยากรณ์ ES6
noego

ก่อนอื่นคุณไม่ได้เข้ารหัสคีย์ นอกจากนี้คุณควรใช้encodeURIComponent()แทนencodeURI. อ่านข้อมูลเกี่ยวกับความแตกต่าง
Przemek

9

ES2017 (ES8)

การใช้ประโยชน์Object.entries()ซึ่งส่งคืนอาร์เรย์ของ[key, value]คู่ของวัตถุ ตัวอย่างเช่นสำหรับมันจะกลับมา{a: 1, b: 2} [['a', 1], ['b', 2]]ไม่รองรับ (และจะไม่เป็น) เฉพาะโดย IE

รหัส:

const buildURLQuery = obj =>
      Object.entries(obj)
            .map(pair => pair.map(encodeURIComponent).join('='))
            .join('&');

ตัวอย่าง:

buildURLQuery({name: 'John', gender: 'male'});

ผลลัพธ์:

"name=John&gender=male"

8

หากคุณใช้PrototypeจะมีForm.serialize

หากคุณใช้jQueryจะมีAjax / serialize

ฉันไม่รู้ว่ามีฟังก์ชั่นอิสระใด ๆ ที่จะทำสิ่งนี้ให้สำเร็จ แต่การค้นหาโดย Google พบว่ามีตัวเลือกที่น่าสนใจหากคุณไม่ได้ใช้ห้องสมุด แต่ถ้าคุณไม่เป็นเช่นนั้นคุณควรจะเป็นเพราะสวรรค์


6
jQuery.param () รับวัตถุและแปลงเป็น GET query string (ฟังก์ชันนี้ตรงกับคำถามมากกว่า)
azurkin

5

เช่นเดียวกับการทบทวนคำถามเก่าเกือบ 10 ปีนี้ ในยุคของการเขียนโปรแกรมนอกสถานที่นี้ทางออกที่ดีที่สุดของคุณคือการตั้งค่าโครงการของคุณโดยใช้ตัวจัดการการพึ่งพา ( npm) มีห้องสมุดอุตสาหกรรมกระท่อมทั้งหมดที่เข้ารหัสสตริงการสืบค้นและดูแลกรณีขอบทั้งหมด นี่คือหนึ่งในคนที่ได้รับความนิยมมากขึ้น -

https://www.npmjs.com/package/query-string


คำตอบที่ไม่เจาะจงมาก
masterxilo


-11

เธรดนี้ชี้ไปที่รหัสบางส่วนสำหรับการหลีกเลี่ยง URL ใน php มีescape()และunescape()ที่จะทำงานส่วนใหญ่ แต่คุณต้องเพิ่มสิ่งพิเศษอีกสองสามอย่าง

function urlencode(str) {
str = escape(str);
str = str.replace('+', '%2B');
str = str.replace('%20', '+');
str = str.replace('*', '%2A');
str = str.replace('/', '%2F');
str = str.replace('@', '%40');
return str;
}

function urldecode(str) {
str = str.replace('+', ' ');
str = unescape(str);
return str;
}

3
encodeURIComponent จัดการสิ่งนี้และไม่ได้ใช้ + สำหรับช่องว่างอย่างไม่ถูกต้อง
AnthonyWJones
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.