আমি জানি এটি একটি পুরানো থ্রেড, তবে এটিতে এখনও কিছুটা প্রাসঙ্গিকতা থাকতে পারে?
জ্যাকি লি'র ভাল সমাধান দ্বারা অনুপ্রাণিত হয়ে আমি ইনপুট হিসাবে অ্যারে এবং অবজেক্টের স্বেচ্ছাসেবীর সংমিশ্রণের যত্ন নিতে সক্ষম হওয়ার লক্ষ্যে আমার নিজের কিছুটা প্রকারের চেষ্টা করেছি। আমি পিএইচপি কীভাবে এটি করত তা দেখেছি এবং কিছু "অনুরূপ" হওয়ার চেষ্টা করেছি। আমার কোডটি এখানে:
function getargs(str){
var ret={};
function build(urlnam,urlval,obj){ // extend the return object ...
var i,k,o=obj, x, rx=/\[([^\]]*)\]/g, idx=[urlnam.replace(rx,'')];
while (x=rx.exec(urlnam)) idx.push(x[1]);
while(true){
k=idx.shift();
if(k.trim()=='') {// key is empty: autoincremented index
if (o.constructor.name=='Array') k=o.length; // for Array
else if (o===obj ) {k=null} // for first level property name
else {k=-1; // for Object
for(i in o) if (+i>k) k=+i;
k++;
}
}
if(idx.length) {
// set up an array if the next key (idx[0]) appears to be
// numeric or empty, otherwise set up an object:
if (o[k]==null || typeof o[k]!='object') o[k]=isNaN(idx[0])?{}:[];
o=o[k]; // move on to the next level
}
else { // OK, time to store the urlval in its chosen place ...
// console.log('key',k,'val',urlval);
o[k]=urlval===""?null:urlval; break; // ... and leave the while loop.
}
}
return obj;
}
// ncnvt: is a flag that governs the conversion of
// numeric strings into numbers
var ncnvt=true,i,k,p,v,argarr=[],
ar=(str||window.location.search.substring(1)).split("&"),
l=ar.length;
for (i=0;i<l;i++) {if (ar[i]==="") continue;
p=ar[i].split("=");k=decodeURIComponent(p[0]);
v=p[1];v=(v!=null)?decodeURIComponent(v.replace(/\+/g,'%20')):'';
if (ncnvt && v.trim()>"" && !isNaN(v)) v-=0;
argarr.push([k,v]); // array: key-value-pairs of all arguments
}
for (i=0,l=argarr.length;i<l;i++) build(argarr[i][0],argarr[i][1],ret);
return ret;
}
যদি ফাংশনটি str-আরগমেন্ট ছাড়াই ডাকা হয় তবে এটি window.location.search.slice(1)ইনপুট হিসাবে ধরে নেওয়া হবে ।
কিছু উদাহরণ:
['a=1&a=2', // 1
'x[y][0][z][]=1', // 2
'hello=[%22world%22]&world=hello', // 3
'a=1&a=2&&b&c=3&d=&=e&', // 4
'fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc', // 5
$.param({a:[[1,2],[3,4],{aa:'one',bb:'two'},[5,6]]}), // 6
'a[]=hi&a[]=2&a[3][]=7&a[3][]=99&a[]=13',// 7
'a[x]=hi&a[]=2&a[3][]=7&a[3][]=99&a[]=13'// 8
].map(function(v){return JSON.stringify(getargs(v));}).join('\n')
ফলাফল স্বরূপ
{"a":2} // 1
{"x":{"y":[{"z":[1]}]}} // 2
{"hello":"[\"world\"]","world":"hello"} // 3
{"a":2,"b":null,"c":3,"d":null,"null":"e"} // 4 = { a: 2, b: null, c: 3, d: null, null: "e" }
{"fld":[null,null,[2],[3,4],"bb","cc"]} // 5
{"a":[[1,2],[3,4],{"aa":"one","bb":"two"},[5,6]]} // 6
{"a":["hi",2,null,[7,99],13]} // 7
{"a":{"0":2,"3":[7,99],"4":13,"x":"hi"}} // 8
যেখানে জ্যাকি লি'র সমাধানটি aপ্লেইন অবজেক্ট হিসাবে বাইরের ধারক তৈরি করবে
{a:{"0":["1","2"],"1":["3","4"],"2":["5","6"]}} // 6: JackyLi's output
getargs() এই স্তরটি কোনও অবজেক্ট (অ-সংখ্যাসূচক সূচক) বা কোনও অ্যারে (সংখ্যাসূচক বা খালি) হবে কিনা তা নির্ধারণের জন্য প্রথম প্রদত্ত সূচকটি দেখায়, ফলস্বরূপ তালিকাটি বোভের (নং 6) হিসাবে প্রদর্শিত আউটপুট তৈরি হবে।
যদি বর্তমান অবজেক্টটি একটি অ্যারে হয় তবে nullখালি অবস্থানগুলি উপস্থাপনের জন্য যেখানে প্রয়োজন সেখানে getোকানো হবে। অ্যারেগুলি সর্বদা ধারাবাহিকভাবে সংখ্যাযুক্ত এবং 0-ভিত্তিক থাকে)।
দ্রষ্টব্য, যে উদাহরণে না। 8 খালি সূচকগুলির জন্য "স্বতঃসংশোধন" এখনও কাজ করে, যদিও আমরা এখন কোনও বস্তুর সাথে কাজ করছি এবং অ্যারে নয়।
যতদূর আমি এটি পরীক্ষা করে দেখেছি, আমার গ্রহণযোগ্য উত্তরে উল্লিখিত getargs()ক্রিস রজারের দুর্দান্ত জিকুয়েরি $.deparam() প্লাগইনটির সাথে আমার অনেকটা একইরকম আচরণ হচ্ছে । মূল পার্থক্য হল getargs, jQuery ছাড়া রান এবং এটা করে বস্তু যখন autoincrement $.deparam()হবে না যে কি:
JSON.stringify($.deparam('a[x]=hi&a[]=2&a[3][]=7&a[3][]=99&a[]=13').a);
ফলাফল স্বরূপ
{"3":["7","99"],"x":"hi","undefined":"13"}
ইন $.deparam()সূচক []একটি হিসাবে ব্যাখ্যা করা হয় undefinedএকটি autoincremented সংখ্যাসূচক সূচক পরিবর্তে।
+। এখন এটি তাদের সকলকে প্রতিস্থাপন করে!