当前位置: 首页 > Web前端 > JavaScript

每天一个npm包的qs

时间:2023-03-27 16:01:54 JavaScript

用途:解析成对象,解析成数组,串空值,并使用用途:下载代码:https://github.com/huangyangq...执行nodeindex.js,查看输出varqs=require('qs');varobj=qs.parse('a=c');console.log('obj:',obj);varstr=qs.stringify(obj);console.log('str:',str);解析为对象://嵌套对象varobj2=qs.parse('foo[bar]=baz')console.log('obj2:',obj2);varobj3=qs.parse('foo[bar][baz]]=foobarbaz')console.log('obj3:',obj3);//创建空对象varnullObject=qs.parse('a[hasOwnProperty]=b',{plainObjects:true});console.log('nullObject:',nullObject);console.log('nullObjectisanemptyobject',nullObject.toString)//覆盖原型上的值varprotoObject=qs.parse('a[hasOwnProperty]=b',{allowPrototypes:true});console.log('protoObject:',protoObject);//URL编码字符串consturlObj=qs.parse('a%5Bb%5D=c')console.log('urlObj:',urlObj);//默认嵌套深度为5,可以按深度设置vardeep=qs.parse('a[b][c][d][e][f][g][h][i]=j',{depth:1});console.log('deep:',deep);//解析参数默认1000个,可以通过parameterLimit设置varlimited=qs.parse('a=b&c=d',{parameterLimit:1});console.log('limited:',limited);//需要绕过前导问号,可以通过ignoreQueryPrefix设置:varprefixed=qs.parse('?a=b&c=d',{ignoreQueryPrefix:true});console.log('prefixed:',prefixed);//有指定分隔符,可以通过delimiter设置:vardelimited=qs.parse('a=b;c=d',{delimiter:';'});console.log('delimited:',delimited);//分隔符也可以是正则表达式:varregexed=qs.parse('a=b;c=d,e=f',{delimiter:/[;,]/});console.log('regexed:',regexed);//选项allowDots可用于启用点表示方法:varwithDots=qs.parse('a.b=c',{allowDots:true});console.log('withDots:',withDots);//如果你必须处理旧的浏览器或服务,也支持百分比Encodedoctets解码为iso-8859-1:varoldCharset=qs.parse('a=%A7',{charset:'iso-8859-1'});console.log('oldCharset:',oldCharset);解析成一个数组:varwithArray=qs.parse('a[]=b&a[]=c');console.log('withArray:',withArray);//可以指定字符在数组中的位置:varwithIndexes=qs.parse('a[1]=c&a[0]=b');console.log('withIndexes:',withIndexes);注意数组中索引和对象中键的唯一性区别在括号之间值必须是数字才能创建数组当创建具有特定索引的数组时,qs会将稀疏数组压缩为仅保留其顺序的现有值:varnoSparse=qs.parse('a[1]=b&a[15]=c');console.log('noSparse:',noSparse);//也可以使用allowSparse选项解析稀疏数组:varsparseArray=qs.parse('a[1]=2&a[6]=5',{allowSparse:true});console.log('sparseArray:',sparseArray);//注意空串也是一个值,会被保留:varwithIndexedEmptyString=qs.parse('a[0]=b&a[1]=&a[2]=c&a[3]=');console.log('withIndexedEmptyString:',withIndexedEmptyString);qs也会将数组中指定的最大索引限制为20。任何数组成员索引大于20的将被转换为索引键控的对象。这对于处理某人发送的情况是必要的,例如,a[999999999]并且需要大量时间来遍历这个巨大的数组。varwithMaxIndex=qs.parse('a[100]=b');console.log('withMaxIndex:',withMaxIndex);//可以通过传递arrayLimit选项来覆盖此限制:varwithArrayLimit=qs.parse('a[101]=b',{arrayLimit:101});console.log('withArrayLimit:',withArrayLimit);varwithArrayLimit1=qs.parse('a[102]=b',{arrayLimit:101});console.log('withArrayLimit1:',withArrayLimit1);//禁用数组完全解析,将parseArrays设置为false:varnoParsingArrays=qs.parse('a[]=b&a[]=c',{parseArrays:false});console.log('noParsingArrays:',noParsingArrays);varnoParsingArrays=qs.parse('a[]=b&a[3]=c',{parseArrays:false});console.log('noParsingArrays:',noParsingArrays);//如果混合使用符号,qs会将两项合并为一个对象:varmixedNotation=qs.parse('a[0]=b&a[b]=c');console.log('mixedNotation:',mixedNotation);//你也可以创建对象数组:vararraysOfObjects=qs.parse('a[][b]=c');console.log('arraysOfObjects:',arraysOfObjects);vararraysOfObjects1=qs.parse('a[b][]=c');console.log('arraysOfObjects1:',arraysOfObjects1);//有人用过逗号连接数组,qs可以解析:vararraysOfObjects=qs.parse('a=b,c',{comma:true})console.log('arraysOfObjects:',arraysOfObjects);注意:(这不能转换嵌套对象,比如a={b:1},{c:d})stringify:qs.stringify(object,[options]);//stringifying时,默认qsURI编码输出对象按照您的预期进行字符串化:console.log(qs.stringify({a:'b'}));console.log(qs.stringify({a:{b:'c'}}))//这个编码可以通过设置encode选项为false来关闭:varunencoded=qs.stringify({a:{b:'c'}},{编码:false});console.log('unencoded:',unencoded);//可以通过将encodeValuesOnly选项设置为true来禁用键的编码:varencodedValues=qs.stringify({a:'b',c:['d','e=f'],f:[['g'],['h']]},{encodeValuesOnly:true});console.log('encodedValues:',encodedValues);//编码也可以通过optionencoder设置为自定义编码方式:varencoded=qs.stringify({a:{b:'c'}},{encoder:function(str){//传入的值`a`,`b`,`c`console.log(str)return//返回编码后的字符串}})console.log('encoded:',encoded);//(注意:如果encode为false,encoder选项不适用)//像encoder一样,有一个decodeforparsingdecoder选项来覆盖属性和值的解码:vardecoded=qs.parse('x=z',{decoder:function(str){//传入值`x`,`z`returnstr+'JOSHUA'//返回解码后的字符串}})console.log(decoded);//你可以使用提供给编码器的类型参数类型对键和值进行不同逻辑的编码:varencoded1=qs.stringify({a:{b:'c'}},{encoder:function(str,defaultEncoder,charset,type){if(type==='key'){返回'key'+str//编码键}elseif(type==='value'){return'value'+str//编码值}}})console.log(encoded1);//类型参数也提供给解码器:vardecoded1=qs.parse('x=z',{decoder:function(str,defaultDecoder,charset,type){if(type==='key'){return//Decodedkey}elseif(type==='value'){return//Decodedvalue}}})console.log(decoded1);//为了清楚起见,用于解释的示例看起来可能会超出thissection,asiftheoutputisnotURI-encoded//请注意,在实际使用过程中,这些情况下的返回值将被URI编码。//当数组被字符串化时,默认给它们明确的索引:console.log(qs.stringify({a:['b','c','d']}));//'a[0]=b&a[1]=c&a[2]=d'//您可以通过将索引选项设置为false来覆盖它:console.log(qs.stringify({a:['b','c','d']},{indices:false}));//'a=b&a=c&a=d'//可以使用arrayFormat选项指定输出数组的格式:console.log(qs.stringify({a:['b','c']},{arrayFormat:'indices'}));//'a[0]=b&a[1]=c'console.log(qs.stringify({a:['b','c']},{arrayFormat:'brackets'}));//'a[]=b&a[]=c'console.log(qs.stringify({a:['b','c']},{arrayFormat:'repeat'}));//'a=b&a=c'console.log(qs.stringify({a:['b','c']},{arrayFormat:'逗号'}));//'a=b,c'//对象字符串化时,默认使用括号表示法:console.log(qs.stringify({a:{b:{c:'d',e:'f'}}}));//'a[b][c]=d&a[b][e]=f'//您可以将allowDots选项设置为true以覆盖它以使用点表示法:console.log(qs.stringify({a:{b:{c:'d',e:'f'}}},{allowDots:true}));//'a.b.c=d&a.b.e=f'//空字符串和空值会省略值,但等号(=)保持不变:console.log(qs.stringify({a:''}));//没有有值的键(如空对象或数组)将什么都不返回:console.log('1',qs.stringify({a:[]}));console.log('2',qs.stringify({a:{}}));console.log('3',qs.stringify({a:[{}]}));console.log('4',qs.stringify({a:{b:[]}}));console.log('5',qs.stringify({a:{b:{}}}));//设置为undefined的属性将被完全省略:console.log(qs.stringify({a:null,b:undefined}));//查询字符串前面可以有一个问号:console.log(qs.stringify({a:'b',c:'d'},{addQueryPrefix:true}));//分隔符也可以被stringify覆盖:console.log(qs.stringify({a:'b',c:'d'},{delimiter:';'}));//如果你只想覆盖Date对象的序列化,你可以提供一个serializeDate选项:vardate=newDate(7);console.log(qs.stringify({a:date}));console.log(qs.stringify({a:date},{serializeDate:function(d){returnd.getTime();}}),);//可以使用排序选项来影响参数键的顺序:functionalphabeticalSort(a,b){returna.localeCompare(b);}console.log(qs.stringify({a:'c',z:'y',b:'f'},{sort:alphabeticalSort}));//最后,你可以使用用于限制哪些键包含在字符串化输出中的过滤器选项实用//如果传递一个函数,这个函数对每个key调用一次,返回值是通过执行这个函数得到的,替换key的值。//否则,如果您传递一个数组,它将用于选择字符串化属性和数组索引:functionfilterFunc(prefix,value){if(prefix=='b'){//返回一个`undefined`值以省略财产。返回;}if(prefix=='e[f]'){返回值。获取时间();}if(prefix=='e[g][0]'){返回值*2;}返回值;}console.log('过滤器选项')console.log(qs.stringify({a:'b',c:'d',e:{f:newDate(123),g:[2]}},{filter:filterFunc}));//'a=b&c=d&e[f]=123&e[g][0]=4'console.log(qs.stringify({a:'b',c:'d',e:'f'},{filter:['a','e']}));//'a=b&e=f'console.log(qs.stringify({a:['b','c','d'],e:'f'},{filter:['a',0,2]}));//'a[0]=b&a[2]=d'空值的处理://默认情况下,空值被视为空字符串:varwithNull=qs.stringify({a:null,b:''});console.log('withNull:',withNull);//解析不区分带等号和不带等号的参数。两者都转换为空字符串。varequalsInsensitive=qs.parse('a&b=');console.log('equalsInsensitive:',equalsInsensitive);//要区分空值和空字符串,使用strictNullHandling选项。在结果字符串中,空值没有=号:varstrictNull=qs.stringify({a:null,b:''},{strictNullHandling:true});console.log('strictNull:',strictNull);//解析不带=的值返回null,使用strictNullHandling选项:varparsedStrictNull=qs.parse('a&b=',{strictNullHandling:true});console.log('parsedStrictNull:',parsedStrictNull);//要完全跳过具有空值的键的处理输出,请使用skipNulls选项:varnullsSkipped=qs.stringify({a:'b',c:null},{skipNulls:true});console.log('nullsSkipped:',nullsSkipped);//如果您正在与遗留系统通信,您可以使用字符集选项切换到iso-8859-1:variso=qs.stringify({?:'?'},{charset:'iso-8859-1'});console.log('iso:',iso);//iso-8859-1中不存在的字符将被转换为数字实体,类似于浏览器所做的:varnumeric=qs。stringify({a:'?'},{charset:'iso-8859-1'});console.log('numeric:',numeric);关注我的GitHub:@huangyangquan??欢迎关注我的公众号:前端学长Joshua