javascript - array - $.Param() জাভাস্ক্রিপ্ট/jQuery এর বিপরীত ফাংশন




জাভাস্ক্রিপ্ট ভেরিয়েবল (12)

নিচের ফর্মটি দেওয়া হয়েছে:

<form>
    <input name="foo" value="bar">
    <input name="hello" value="hello world">
</form>

আমি $.param( .. ) ফর্মটি সিরিয়ালাইজ করতে ব্যবহার করতে পারি:

$.param( $('form input') )

=> foo=bar&hello=hello+world

কিভাবে আমি জাভাস্ক্রিপ্ট দিয়ে উপরের স্ট্রিংকে deserialize এবং একটি হ্যাশ ফিরে পেতে পারি?

উদাহরণ স্বরূপ,

$.magicFunction("foo=bar&hello=hello+world")

=> {'foo' : 'bar', 'hello' : 'hello world'}

রেফারেন্স: jQuery.param( obj )


আপনি jQuery BBQ এর deparam ফাংশন ব্যবহার করা উচিত। এটা ভাল পরীক্ষিত এবং নথিভুক্ত করা হয়।


আপনি jQuery এর ফাংশন .serializeArray() ( Link ) ব্যবহার করতে পারেন। এই ফাংশন কী-মান জোড়া যুক্ত করে। ফলাফল উদাহরণ:

[
  { name: "id", value: "1" },
  { name: "version", value: "100" }
]

আমার উত্তর:

function(query){
  var setValue = function(root, path, value){
    if(path.length > 1){
      var dir = path.shift();
      if( typeof root[dir] == 'undefined' ){
        root[dir] = path[0] == '' ? [] : {};
      }

      arguments.callee(root[dir], path, value);
    }else{
      if( root instanceof Array ){
        root.push(value);
      }else{
        root[path] = value;
      }
    }
  };
  var nvp = query.split('&');
  var data = {};
  for( var i = 0 ; i < nvp.length ; i++ ){
    var pair = nvp[i].split('=');
    var name = decodeURIComponent(pair[0]);
    var value = decodeURIComponent(pair[1]);

    var path = name.match(/(^[^\[]+)(\[.*\]$)?/);
    var first = path[1];
    if(path[2]){
      //case of 'array[level1]' || 'array[level1][level2]'
      path = path[2].match(/(?=\[(.*)\]$)/)[1].split('][')
    }else{
      //case of 'name'
      path = [];
    }
    path.unshift(first);

    setValue(data, path, value);
  }
  return data;
}

আমি এই সমাধানটি নিয়ে এসেছি, যা HttpUtility.ParseQueryString ফাংশন HttpUtility.ParseQueryString মত আচরণ করে।

ফলস্বরূপ, ক্যোয়ারী স্ট্রিং প্যারামিটারগুলি মানগুলির তালিকা হিসাবে বৈশিষ্ট্যগুলিতে স্টোর হয়, যাতে qsObj["param"] GetValues("param") কল হিসাবে একই হবে।

আশা করি তুমি পছন্দ করেছ. JQuery প্রয়োজন নেই।

var parseQueryString = function (querystring) {
    var qsObj = new Object();
    if (querystring) {
        var parts = querystring.replace(/\?/, "").split("&");
        var up = function (k, v) {
            var a = qsObj[k];
            if (typeof a == "undefined") {
                qsObj[k] = [v];
            }
            else if (a instanceof Array) {
                a.push(v);
            }
        };
        for (var i in parts) {
            var part = parts[i];
            var kv = part.split('=');
            if (kv.length == 1) {
                var v = decodeURIComponent(kv[0] || "");
                up(null, v);
            }
            else if (kv.length > 1) {
                var k = decodeURIComponent(kv[0] || "");
                var v = decodeURIComponent(kv[1] || "");
                up(k, v);
            }
        }
    }
    return qsObj;
};

এটি কিভাবে ব্যবহার করবেন তা এখানে:

var qsObj = parseQueryString("a=1&a=2&&b&c=3&d=&=e&");

কনসোল জেসে ফলাফলটি পূর্বরূপ দেখতে:

JSON.stringify(qsObj)

আউটপুট:

"{"a":["1","2"],"null":["","b",""],"c":["3"],"d":[""],"":["e"]}"

আমি ডেভিড ডোরওয়ার্ডের উত্তরটি ব্যবহার করছি, এবং বুঝতে পেরেছি যে এটি পিএইচপি বা রুবিকে রেলের উপর আচরণ করে না যে তারা কিভাবে প্যারামিগুলিকে বিশ্লেষণ করে:

1) একটি পরিবর্তনশীল শুধুমাত্র একটি অ্যারে যদি এটি [] , যেমন ?choice[]=1&choice[]=12 , এটি কখন হয় না ?a=1&a=2

2) যখন mulitple params একই নামের সাথে বিদ্যমান থাকে, তখন পরবর্তীগুলি পিএইচপি সার্ভারের মত পূর্ববর্তীগুলিকে প্রতিস্থাপন করে (রেলগুলিতে রুবি প্রথমটিকে ধরে রাখে এবং পরে উপেক্ষা করে), যেমন: ?a=1&b=2&a=3

তাই ডেভিড এর সংস্করণ পরিবর্তন, আমি আছে:

function QueryStringToHash(query) {

  if (query == '') return null;

  var hash = {};

  var vars = query.split("&");

  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    var k = decodeURIComponent(pair[0]);
    var v = decodeURIComponent(pair[1]);

    // If it is the first entry with this name
    if (typeof hash[k] === "undefined") {

      if (k.substr(k.length-2) != '[]')  // not end with []. cannot use negative index as IE doesn't understand it
        hash[k] = v;
      else
        hash[k.substr(0, k.length-2)] = [v];

    // If subsequent entry with this name and not array
    } else if (typeof hash[k] === "string") {
      hash[k] = v;  // replace it

    // If subsequent entry with this name and is array
    } else {
      hash[k.substr(0, k.length-2)].push(v);
    }
  } 
  return hash;
};

যা মোটামুটি পুঙ্খানুপুঙ্খভাবে পরীক্ষা করা হয়।


উত্তর jQuery কমনীয়তার একটি বিট ব্যবহার করতে পারে:

(function($) {
var re = /([^&=]+)=?([^&]*)/g;
var decodeRE = /\+/g; // Regex for replacing addition symbol with a space
var decode = function (str) {return decodeURIComponent( str.replace(decodeRE, " ") );};
$.parseParams = function(query) {
    var params = {}, e;
    while ( e = re.exec(query) ) {
        var k = decode( e[1] ), v = decode( e[2] );
        if (k.substring(k.length - 2) === '[]') {
            k = k.substring(0, k.length - 2);
            (params[k] || (params[k] = [])).push(v);
        }
        else params[k] = v;
    }
    return params;
};
})(jQuery);

কাঁটাচামচ https://gist.github.com/956897


একটি অ্যারে বা বস্তুর একটি সিরিয়ালাইজড উপস্থাপনা তৈরি করে (AJAX অনুরোধগুলির জন্য URL ক্যোয়ারী স্ট্রিং হিসাবে ব্যবহার করা যেতে পারে)।

<button id='param'>GET</button> 
<div id="show"></div>
<script>
  $('#param').click(function () {
    var personObj = new Object();
    personObj.firstname = "vishal"
    personObj.lastname = "pambhar";
    document.getElementById('show').innerHTML=$.param(`personObj`));
  });
</script>
output:firstname=vishal&lastname=pambhar

এখানে আপনি কীভাবে একটি নতুন jQuery ফাংশন তৈরি করতে পারেন:

jQuery.unparam = function (value) {
    var
    // Object that holds names => values.
    params = {},
    // Get query string pieces (separated by &)
    pieces = value.split('&'),
    // Temporary variables used in loop.
    pair, i, l;

    // Loop through query string pieces and assign params.
    for (i = 0, l = pieces.length; i < l; i++) {
        pair = pieces[i].split('=', 2);
        // Repeated parameters with the same name are overwritten. Parameters
        // with no value get set to boolean true.
        params[decodeURIComponent(pair[0])] = (pair.length == 2 ?
            decodeURIComponent(pair[1].replace(/\+/g, ' ')) : true);
    }

    return params;
};

এটা ব্যবহার কর :

// convert query string to json object
var queryString = "cat=3&sort=1&page=1";

queryString
    .split("&")
    .forEach((item) => {
        const prop = item.split("=");
        filter[prop[0]] = prop[1];
    });

console.log(queryString);

এটি এমন একটি ফাংশনের সামান্য সংশোধিত সংস্করণ যা আমি কিছুটা অনুরূপ করতে কিছুক্ষণ আগে লিখেছি।

var QueryStringToHash = function QueryStringToHash  (query) {
  var query_string = {};
  var vars = query.split("&");
  for (var i=0;i<vars.length;i++) {
    var pair = vars[i].split("=");
    pair[0] = decodeURIComponent(pair[0]);
    pair[1] = decodeURIComponent(pair[1]);
        // If first entry with this name
    if (typeof query_string[pair[0]] === "undefined") {
      query_string[pair[0]] = pair[1];
        // If second entry with this name
    } else if (typeof query_string[pair[0]] === "string") {
      var arr = [ query_string[pair[0]], pair[1] ];
      query_string[pair[0]] = arr;
        // If third or later entry with this name
    } else {
      query_string[pair[0]].push(pair[1]);
    }
  } 
  return query_string;
};

কিভাবে এই সংক্ষিপ্ত কার্যকরী পদ্ধতির সম্পর্কে?

function parseParams(str) {
    return str.split('&').reduce(function (params, param) {
        var paramSplit = param.split('=').map(function (value) {
            return decodeURIComponent(value.replace(/\+/g, ' '));
        });
        params[paramSplit[0]] = paramSplit[1];
        return params;
    }, {});
}

উদাহরণ:

parseParams("this=is&just=an&example") // Object {this: "is", just: "an", example: undefined}

তাকে ধন্যবাদ http://james.padolsey.com/javascript/parsing-urls-with-the-dom/

খুব সহজ: ডি

function params_unserialize(p){
var ret = {},
    seg = p.replace(/^\?/,'').split('&'),
    len = seg.length, i = 0, s;
for (;i<len;i++) {
    if (!seg[i]) { continue; }
    s = seg[i].split('=');
    ret[s[0]] = s[1];
}
return ret;}




jquery