qs 中文文檔

只是簡(jiǎn)要的并且用自己的話翻譯了一下,方便本人查閱。

引入 QS 庫(kù)

yarn add qs
import qs from 'qs'
import assert from 'assert' //用來測(cè)試

使用

1.Parse Object
  • 基本使用
let obj = qs.parse('a=c'); // {a:'c'}
  • 是否有原型
 let nullObject = qs.parse("a[hasOwnProperty]=b", { plainObjects: true }); //無原型鏈
 var protoObject = qs.parse("a[hasOwnProperty]=b", {allowPrototypes: true});//有原型鏈
  • 嵌套生成
let obj = qs.parse("foo[bar]=baz"); //{foo:{bar:baz}} 
//嵌套的深度設(shè)置
var deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 });
assert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } });
//最多只能到五層
var expected = {
    a: {
        b: {
            c: {
                d: {
                    e: {
                        f: {
                            '[g][h][i]': 'j'
                        }
                    }
                }
            }
        }
    }
};
var string = 'a[b][c][d][e][f][g][h][i]=j';
assert.deepEqual(qs.parse(string), expected);
  • 限制數(shù)量
var limited = qs.parse('a=b&c=d', { parameterLimit: 1 }); //限制為1
assert.deepEqual(limited, { a: 'b' });
  • 去除QueryFix
var prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });
assert.deepEqual(prefixed, { a: 'b', c: 'd' });
  • 設(shè)置判斷分隔的符號(hào)
var delimited = qs.parse('a=b;c=d', { delimiter: ';' });// delimiter可以隨意設(shè)置嗜历,比如 , { |
assert.deepEqual(delimited, { a: 'b', c: 'd' });
  • 使用正則判斷分隔
var regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ });
assert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' });
  • 允許 dots
var withDots = qs.parse('a.b=c', { allowDots: true });
assert.deepEqual(withDots, { a: { b: 'c' } });
2. Parse Array
  • 使用 [] 生成
var withArray = qs.parse('a[]=b&a[]=c');
assert.deepEqual(withArray, { a: ['b', 'c'] });
  • 可以指定 index(max=20)
var withIndexes = qs.parse('a[1]=c&a[0]=b');
assert.deepEqual(withIndexes, { a: ['b', 'c'] });

? 當(dāng)指定的 index 很大(小于20)的時(shí)候,qs 會(huì)自動(dòng)壓縮

var withIndexes = qs.parse('a[1]=c&a[15]=b');
assert.deepEqual(withIndexes, { a: ['b', 'c'] });
  • 允許空值
var withEmptyString = qs.parse('a[]=&a[]=b');
assert.deepEqual(withEmptyString, { a: ['', 'b'] });
 
var withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c');
assert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] });
  • 當(dāng) index 大于20的時(shí)候 會(huì)變成對(duì)象
var withMaxIndex = qs.parse('a[100]=b');
assert.deepEqual(withMaxIndex, { a: { '100': 'b' } });

? 當(dāng)然這個(gè) max 值你可以自己設(shè)定(0~20 奥邮,超過20設(shè)不設(shè)置都一樣了)

var withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 });
assert.deepEqual(withArrayLimit, { a: { '1': 'b' } });

? 你甚至可以直接不讓它生成數(shù)組

var noParsingArrays = qs.parse('a[]=b', { parseArrays: false });
assert.deepEqual(noParsingArrays, { a: { '0': 'b' } });
  • 混合使用腥光,返回的是Object
var mixedNotation = qs.parse('a[0]=b&a[b]=c');
assert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } });
  • 生成 Object
var arraysOfObjects = qs.parse('a[][b]=c');
assert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] });
3. Parse stringify
  • 基本使用,默認(rèn)encode輸出
qs.stringify(object, [options]);
assert.equal(qs.stringify({ a: 'b' }), 'a=b');
assert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');
  • 關(guān)閉 encode
var unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false });
assert.equal(unencoded, 'a[b]=c');
  • 只對(duì) value encode
var encodedValues = qs.stringify(
    { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] },
    { encodeValuesOnly: true }
);
assert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h');
  • 自定義 encode
var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) {
    // Passed in values `a`, `b`, `c`
    return // Return encoded string
}})
  • 自定義 decode
var decoded = qs.parse('x=z', { decoder: function (str) {
    // Passed in values `x`, `z`
    return // Return decoded string
}})
  • 對(duì) Array 使用 arrayFormat
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })
// 'a[0]=b&a[1]=c'
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })
// 'a[]=b&a[]=c'
qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })
// 'a=b&a=c'
  • 對(duì) Object 操作默認(rèn)為 bracket notation
qs.stringify({ a: { b: { c: 'd', e: 'f' } } });
// 'a[b][c]=d&a[b][e]=f'
也可以設(shè)置為  dots notation
qs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true });
// 'a.b.c=d&a.b.e=f'
  • 空的字符串或者 null 的時(shí)候會(huì)省略值,但是等號(hào)(=)會(huì)保留
assert.equal(qs.stringify({ a: '' }), 'a=');
assert.equal(qs.stringify({ a: null }), 'a=');
  • 當(dāng)一個(gè)key對(duì)應(yīng)的值為空時(shí)(空數(shù)組阳掐,空對(duì)象),沒有返回值
assert.equal(qs.stringify({ a: [] }), '');
assert.equal(qs.stringify({ a: {} }), '');
assert.equal(qs.stringify({ a: [{}] }), '');
assert.equal(qs.stringify({ a: { b: []} }), '');
assert.equal(qs.stringify({ a: { b: {}} }), '');
  • value 為 undefined 的時(shí)候也會(huì)被忽略
assert.equal(qs.stringify({ a: null, b: undefined }), 'a=');
  • 一個(gè) query 字符串可以預(yù)添加 (?)
assert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d');
  • 設(shè)置分隔字符串
assert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');
  • 如果只想重寫日期對(duì)象的序列化始衅,則可以提供序列化選項(xiàng)
var date = new Date(7);
assert.equal(
    qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }),
    'a=7'
);
  • 可以使用 sort 選項(xiàng),對(duì) key 進(jìn)行排序
function alphabeticalSort(a, b) {
    return a.localeCompare(b);
}
assert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y');
  • 通過對(duì) key 進(jìn)行 filter 缭保,并對(duì) value 操作
function filterFunc(prefix, value) {
    if (prefix == 'b') {
        // Return an `undefined` value to omit a property.
        return;
    }
    if (prefix == 'e[f]') {
        return value.getTime();
    }
    if (prefix == 'e[g][0]') {
        return value * 2;
    }
    return value;
}
qs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc });
// 'a=b&c=d&e[f]=123&e[g][0]=4'
qs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] });
// 'a=b&e=f'
qs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] });
// 'a[0]=b&a[2]=d'
  • 對(duì) null 的處理

在默認(rèn)下汛闸,null 會(huì)被當(dāng)做空字符串處理

var withNull = qs.stringify({ a: null, b: '' });
assert.equal(withNull, 'a=&b=');

Parse 不區(qū)分有沒有 = 的參數(shù),他們都會(huì)被解析為空字符串

var equalsInsensitive = qs.parse('a&b=');
assert.deepEqual(equalsInsensitive, { a: '', b: '' });

現(xiàn)在艺骂,為了區(qū)分 null 和 空字符串的區(qū)別诸老,你可以加上 strictNullHandling,他會(huì)區(qū)分 null 和空字符串

var strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true });
assert.equal(strictNull, 'a&b=');
var parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true });
assert.deepEqual(parsedStrictNull, { a: null, b: '' });

如果你想忽略 value === null的鍵值對(duì)钳恕,可以使用 skipNulls

var nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true });
assert.equal(nullsSkipped, 'a=b');
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末别伏,一起剝皮案震驚了整個(gè)濱河市蹄衷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厘肮,老刑警劉巖愧口,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異类茂,居然都是意外死亡调卑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門大咱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恬涧,“玉大人,你說我怎么就攤上這事碴巾∷堇Γ” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵厦瓢,是天一觀的道長(zhǎng)提揍。 經(jīng)常有香客問我,道長(zhǎng)煮仇,這世上最難降的妖魔是什么劳跃? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮浙垫,結(jié)果婚禮上刨仑,老公的妹妹穿的比我還像新娘。我一直安慰自己夹姥,他們只是感情好杉武,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辙售,像睡著了一般轻抱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旦部,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天祈搜,我揣著相機(jī)與錄音,去河邊找鬼士八。 笑死容燕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的曹铃。 我是一名探鬼主播缰趋,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了秘血?” 一聲冷哼從身側(cè)響起味抖,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灰粮,沒想到半個(gè)月后仔涩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粘舟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年熔脂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柑肴。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霞揉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晰骑,到底是詐尸還是另有隱情适秩,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布硕舆,位于F島的核電站秽荞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抚官。R本人自食惡果不足惜扬跋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凌节。 院中可真熱鬧钦听,春花似錦、人聲如沸刊咳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)娱挨。三九已至,卻和暖如春捕犬,著一層夾襖步出監(jiān)牢的瞬間跷坝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工碉碉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柴钻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓垢粮,卻偏偏與公主長(zhǎng)得像贴届,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)毫蚓,也就是一...
    悟名先生閱讀 4,149評(píng)論 0 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理占键,服務(wù)發(fā)現(xiàn),斷路器元潘,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測(cè)試 ...
    KeKeMars閱讀 6,336評(píng)論 0 6
  • 文/李衛(wèi)星 我是一個(gè)農(nóng)村走出來的大學(xué)生畔乙,弟兄三個(gè),我是長(zhǎng)子翩概。當(dāng)時(shí)家庭條件比較差牲距,于是我就跟奶奶一起生活,直到8歲才...
    生命主宰閱讀 391評(píng)論 6 6
  • HOURING莊園客片 春天讓我們?cè)贖OURING莊園遇見你們哦~ 一點(diǎn)一滴的小美好給我們每一天的好心情 2018...
    椒江h(huán)ouring莊園兒童攝影閱讀 156評(píng)論 0 0