একটি জাভাস্ক্রিপ্ট অবজেক্টের ক্যোরি-স্ট্রিং এনকোডিং


481

একটি জাভাস্ক্রিপ্ট অবজেক্টকে এমন একটির মধ্যে এনকোড করার একটি দ্রুত এবং সহজ উপায় stringযা আমি একটি GETঅনুরোধের মধ্য দিয়ে যেতে পারি ?

না jQuery, অন্য কোনও ফ্রেমওয়ার্ক নেই - কেবল সরল জাভাস্ক্রিপ্ট :)


আপনার সমাধানের জন্য যদি কোনও উপযুক্ত থাকে তবে জিকুয়ারি কেন সমাধান হতে পারে না?
eaglei22

@ agগলই 22 কারণ আমি যখন আইপিটিভি সেট টপ বক্স ডিভাইসের জন্য একটি প্রকল্পে কাজ করছিলাম এবং কোনও বাহ্যিক গ্রন্থাগার অনুমতি দেওয়া হয়নি। ;-)
নেপলাক্স

1
উত্তরের জন্য ধন্যবাদ. আমি সময় সময় এই স্পেসিফিকেশন দেখতে এবং কেন একটি পরিস্থিতিতে সর্বদা অবাক। ভাল, এখন আমি একটি পেয়েছি, ধন্যবাদ! :)
agগল

9
@ agগলি 22 কারণ কখনও কখনও আপনি আইডির মাধ্যমে একটি উপাদান পেতে কোনও বড় লাইব্রেরি লোড করতে চান না।
হারুন হারুন

বেশিরভাগ ব্রাউজার URLSearchParamsএখনই সমর্থন করে ...
এমবি 21

উত্তর:


810

এটার মত?

serialize = function(obj) {
  var str = [];
  for (var p in obj)
    if (obj.hasOwnProperty(p)) {
      str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
    }
  return str.join("&");
}

console.log(serialize({
  foo: "hi there",
  bar: "100%"
}));
// foo=hi%20there&bar=100%25

সম্পাদনা করুন: এটি পুনরাবৃত্ত বস্তুগুলিকে রূপান্তর করে (ক্যোরির স্ট্রিংয়ের জন্য পিএইচপি "অ্যারে" স্বরলিপি ব্যবহার করে)

serialize = function(obj, prefix) {
  var str = [],
    p;
  for (p in obj) {
    if (obj.hasOwnProperty(p)) {
      var k = prefix ? prefix + "[" + p + "]" : p,
        v = obj[p];
      str.push((v !== null && typeof v === "object") ?
        serialize(v, k) :
        encodeURIComponent(k) + "=" + encodeURIComponent(v));
    }
  }
  return str.join("&");
}

console.log(serialize({
  foo: "hi there",
  bar: {
    blah: 123,
    quux: [1, 2, 3]
  }
}));
// foo=hi%20there&bar%5Bblah%5D=123&bar%5Bquux%5D%5B0%5D=1&bar%5Bquux%5D%5B1%5D=2&bar%5Bquux%5D%5B2%5D=3


2
এটি প্রদত্ত break foo: [1,2,3], বার: "100%"} ভাঙবে না?
কোয়ান্টিন

1
@ ওফ্রি: এটি পাওয়ার জন্য সেট আপ করা সার্ভারে পোষ্ট অনুরোধের জন্য, জেএসএন একটি ভাল পছন্দ। জিইটি অনুরোধগুলির জন্য, আপনি যদি সার্ভারে কয়েকটি সাধারণ পরামিতি ব্যতীত অন্য কিছু প্রেরণ করেন তবে সম্ভবত আপনার নকশাটি ভুল।
টিম ডাউন

2
@ মার্সেল এর কারণ ফাংশনটি ওজনপ্রোপার্টি পরীক্ষা করে না। আমি আপনার ফ্রিডলটি
রুডি

1
@ টিমডাউন আপনার মন্তব্য সম্পর্কে জিইটি অনুরোধগুলিতে সাধারণ পরামিতি প্রেরণ সম্পর্কিত। আমি একমত না. অ্যারেগুলিতে প্যারামিটারগুলি গোষ্ঠীভুক্ত হতে পারে কারণ সার্ভার সাইডে পিএইচপি যাওয়ার জন্য প্রস্তুত-স্থিতিশীল এসোসিয়েটিভ অ্যারের সন্ধান করে। ডিজাইন হিসাবে এটি কেন ভুল তা আমি দেখতে পাচ্ছি না।
সাভাস বেদোভা

1
'If (ob.hasOwnProperty (prop))' দরকার কি? অবজেক্টের লুপের জন্য কেবলমাত্র অবজেক্টটির বৈশিষ্ট্যগুলি কল করা হয়েছে যেমন হ'লনপ্রপার্টি সর্বদা সত্যের কাছে মূল্যায়ন করে
আর্নন

231

jQuery এর এর জন্য একটি ফাংশন রয়েছে jQuery.param(), আপনি যদি ইতিমধ্যে এটি ব্যবহার করেন তবে আপনি এটি ব্যবহার করতে পারেন: http://api.jquery.com/jquery.param/

উদাহরণ:

var params = { width:1680, height:1050 };
var str = jQuery.param( params );

str এখন রয়েছে width=1680&height=1050


119
নেপোলাক্স (ওপি) এর উদ্ধৃতি: "কেবল সরল জাভাস্ক্রিপ্ট" । : পি
Sk8erPeter

6
jQuery.param () এর ভীতিজনক আচরণ রয়েছে। Var a = [] চালানোর চেষ্টা করুন; a [2564] = 12; কনসোল.লগ (jQuery.param ({সম্পত্তি তালিকা: একটি})); আমি বলতে চাইছি কি।
akond

13
@ অ্যাকন্ড জিকুয়েরি ডকুমেন্টেশনটি সুনির্দিষ্টভাবে বলেছে যে আপনি খালি অ্যারেতে যেতে পারেন না।
অ্যারিয়েল

4
@ অ্যারিল তিনি খালি অ্যারে পার করছেন না। তিনি 2564 সূচকটিতে কেবল একটি মান সহ একটি অ্যারে পেরিয়ে যাচ্ছেন demonst প্রদর্শন করতে: var a = []; a[5] = 'foo'; jQuery.param({ parameters: a }); ফলাফল "parameters[]=&parameters[]=&parameters[]=&parameters[]=&parameters[]=&parameters[]=foo"। যা সঠিক, আপনি যা প্রত্যাশা করেছেন তা নাও হতে পারে।
ক্রিস হল

4
প্রশ্নটি বিশেষত ভ্যানিলা জেএসকে জিজ্ঞাসা করেছে
বাগ হান্টার 219

188

কেবল ব্যবহার করুন URLSearchParamsএটি সমস্ত বর্তমান ব্রাউজারে কাজ করে

new URLSearchParams(object).toString()

5
না কারণ এটি পুনরাবৃত্ত বস্তুগুলি না করে
এডি মঙ্গে জুনিয়র

নেস্টেড অবজেক্টে কাজ করে না। let j = { m: 5, n: { k: 1 } }; new URLSearchParams(j).toString(); // result "m=5&n=%5Bobject+Object%5D"
হাইটাটোডস্ট্রাকচার

19
@ এডিমঞ্জজেআর ক্যোরি স্ট্রিংগুলি ডিজাইনের ভিত্তিতে কী-মূল্যযুক্ত জোড়স্বরূপ, আপনি এমনকি নেস্টেড অবজেক্টগুলিকে ক্রিয়াকলাপ করতে চাইবেন না এই উত্তরটি যাওয়ার আধুনিক উপায়। Upvotes প্রয়োজন।
রোমেন ডুরান্ড

5
হ্যাঁ এগুলি মূল মান জোড় তবে এমন কোনও কিছুই নেই যা বলে যে মানটি কোনও স্ট্রিং এনকোডেড বস্তু হতে পারে না। এছাড়াও, মূল প্রশ্নগুলি একটি "জাভাস্ক্রিপ্ট অবজেক্টটিকে একটি স্ট্রিংয়ের জন্য" জিজ্ঞাসা করে, যার মধ্যে নেস্টেড বৈশিষ্ট্য থাকতে পারে
এডি মঙ্গ জুনিয়র

@ এডি মঞ্জজেও এমনকি স্বীকৃত উত্তর (এবং সংক্ষিপ্তভাবে দেখার পরে অন্যরা) নেস্টেড বস্তুকে সমর্থন করে না। আপনি stringifyযা করার আগে নেস্টেড জিনিসগুলি করতে পারেনURLSearchParams
মোশ ফেউ

128
Object.keys(obj).reduce(function(a,k){a.push(k+'='+encodeURIComponent(obj[k]));return a},[]).join('&')

সম্পাদনা করুন: আমি এই ওয়ান-লাইনারটি পছন্দ করি তবে আমি বাজি রাখি যদি এটি গ্রহণযোগ্য উত্তরটি শব্দার্থভাবে মিলায় তবে এটি আরও জনপ্রিয় উত্তর হবে:

function serialize( obj ) {
    let str = '?' + Object.keys(obj).reduce(function(a, k){
        a.push(k + '=' + encodeURIComponent(obj[k]));
        return a;
    }, []).join('&');
    return str;
}

1
রিডাক্ট ফাংশনের জন্য একটি উত্সর্গীকৃত লাইন যদিও পঠনযোগ্যতা উন্নত করবে।
অরেলিন রিবন

54
.Reduce () এর পরিবর্তে .map () ব্যবহার করা আরও সহজ হবে: Object.keys(obj).map(k => k + '=' + encodeURIComponent(obj[k])).join('&')
জ্যানস

2
কেবলমাত্র Object.keysআইটি> = 9
জনস্টন

5
সংক্ষিপ্তকরণের পরিবর্তে ES6 টেমপ্লেটগুলি ব্যবহার করে @ জেনস কোডটি আরও উন্নত করা হয়েছে -Object.keys(obj).map(k => `${k}=${encodeURIComponent(obj[k])}`).join('&')
সিল্ক

1
যদি আপনার কি খুব encodeUriComponent ❤️ প্রয়োজন: Object.entries(obj).map(e => e.map(ee => encodeURIComponent(ee)).join('=')).join('&');
ব্লেইস

112

ES6 এ এখানে একটি ওলাইনার রয়েছে:

Object.keys(obj).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(obj[k])}`).join('&');

কী ডাব্লু / কে প্রতিস্থাপন করুন এবং আপনি সোনালি
জেমি কুডলা

17
সতর্কবাণী! এটি কেবল অগভীর বস্তুগুলিতে কাজ করে। আপনার যদি শীর্ষ-স্তরের সম্পত্তি থাকে যা অন্য একটি অবজেক্ট, তবে এই একটি লাইনার "কী =% 5 بابজেক্ট% 20অবজেক্ট% 5 ডি" আউটপুট দেবে। ঠিক যেমন একটি মাথা উপরে।
অ্যান্ড্রু অলব্রাইট

4
এছাড়াও, এটি অ্যারে স্পিট করে না। আমি পেয়েছিলাম export?actions[]=finance,create,editযখন এটি হওয়া উচিত ছিল export?actions[]=finance&actions[]=create&actions[]=editভয়ঙ্কর মান standard
ডার্কব্লিউসুন

3
অ্যারেগুলি সর্বদা "আপনি নিজেরাই" থাকুন কারণ ইউআরএল আর্গুমেন্টগুলি কেবলমাত্র স্ট্রিং থেকে শুরু করে যতক্ষণ না স্পিক সম্পর্কিত, তাই আপনি এমন কিছু তৈরির জন্য হুকের উপরে আছেন যা সার্ভারের দ্বারা সঠিকভাবে পড়তে পারে না আপনি ফোন করছেন actions[]পিএইচপি স্বরলিপি হয়; জাজানো actionপরিবর্তে একাধিক ব্যবহার করে ( []প্রত্যয় নেই); অন্য কয়েকটি ওআরএম / সিএমএসের জন্য কমা-বিচ্ছিন্ন তালিকা ইত্যাদির প্রয়োজন হয় So সুতরাং "যদি এটি সাধারণ স্ট্রিং না হয় তবে প্রথমে নিশ্চিত হয়ে নিন যে আপনার সার্ভারটি কী চাইবে" know
মাইক 'পোম্যাক্স' কামারম্যানস

খুব মার্জিত সমাধান!
আনহ ট্রান

51

নোড.জেএস v6.6.3 সহ

const querystring = require('querystring')

const obj = {
  foo: 'bar',
  baz: 'tor'
}

let result = querystring.stringify(obj)
// foo=bar&baz=tor

তথ্যসূত্র: https://nodejs.org/api/querystring.html


8
এটি আইএমও ডাউনভোট করা উচিত নয়, এটি যদি সার্ভারে জেএস হয় তবে এটি সঠিক উত্তর হওয়া উচিত।
মাইকেল বেনিন

4
দেখে মনে হচ্ছে এটি নেস্টেড অবজেক্টগুলিকে সমর্থন করে না।
ইয়ারিন সোনার

43

আমি URLSearchParamsইন্টারফেসটি ব্যবহার করার পরামর্শ দিচ্ছি :

const searchParams = new URLSearchParams();
const search = {foo: "hi there", bar: "100%" };
Object.keys(search).forEach(key => searchParams.append(key, search[key]));
console.log(searchParams.toString())

বা সার্চ অবজেক্টটি কনস্ট্রাক্টরের মধ্যে এইভাবে পাস করার মাধ্যমে:

const obj = {foo: "hi there", bar: "100%" };
const params = new URLSearchParams(obj).toString();

1
আকর্ষণীয় পরামর্শ, তবে সচেতন থাকুন যে এই বৈশিষ্ট্যের জন্য ব্রাউজার সমর্থনটি এখনও খুব প্যাচাল।
মেরেক

আপনি যদি আইই (যা এখন বেশ সাধারণ) এবং কিছু নির্দিষ্ট মোবাইল সংস্করণ সমর্থন না করে থাকেন তবে এটি সাধারণ উত্তর, কারণ এটি সাধারণ জাভাস্ক্রিপ্ট।
মার্কোস সান্দ্রিনী

24

ব্যবহারকারী 187291 দ্বারা গৃহীত সমাধানের জন্য একটি ছোট সংশোধন:

serialize = function(obj) {
   var str = [];
   for(var p in obj){
       if (obj.hasOwnProperty(p)) {
           str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
       }
   }
   return str.join("&");
}

অবজেক্টে হ'লঅনপ্রোপার্টি পরীক্ষা করা জেএসলিন্ট / জেএসহিন্টকে খুশি করে তোলে এবং এটি ঘটনাক্রমে ঘটনাক্রমে পদ্ধতি বা অন্য জিনিসগুলির সিরিয়ালাইজিং পদ্ধতিগুলি রোধ করে যদি বস্তুটি একটি সাধারণ অভিধান ছাড়া আর কিছু হয়। এই পৃষ্ঠায় বিবৃতিগুলির জন্য অনুচ্ছেদটি দেখুন: http://javascript.crockford.com/code.html


14

ওয়েল, সবাই মনে হয় এখানে তার ওয়ান-লাইনার লাগিয়েছে তাই এখানে আমার চলে যায়:

const encoded = Object.entries(obj).map(([k, v]) => `${k}=${encodeURIComponent(v)}`).join("&");

1
আইজিকে.অন্ট্রিগুলি সমর্থিত নয়।
এমবিউউম্যান

@ এমউউউউম্যান অবশ্যই, আইই ভাল-মন্দকে ছাড়িয়ে গেছে, এজন্য আপনাকে
বাবেল

@ chpio বাবেল / কোর-জেএস সঠিক না হলে অবজেক্ট.এন্ট্রিগুলিকে সমর্থন করে না।
এমবিউউম্যান

কোরটির অবজেক্ট.এন্ট্রিগুলির জন্য সমর্থন রয়েছে: github.com/zloirock/core-js/blob/master/… এবং এমনকি পুরাতন কোরজ 2 টু ব্যাচ রানটাইম রূপান্তর এটি সমর্থন করে পাশাপাশি github.com/babel/babel/blob/…
chpio

12

আপনার কি স্বেচ্ছাচারী বস্তু প্রেরণ করা দরকার? যদি তা হয় তবে জিইটি হ'ল একটি খারাপ ধারণা, যেহেতু ইউআরএল এজেন্টস এবং ওয়েব সার্ভাররা গ্রহণ করবে এমন ইউআরএলগুলির দৈর্ঘ্যের সীমা রয়েছে। আমার পরামর্শটি হ'ল নাম মান সংযোজনগুলির একটি অ্যারে তৈরি করতে পাঠাতে এবং তারপরে একটি ক্যোরি স্ট্রিং তৈরি করতে হবে:

function QueryStringBuilder() {
    var nameValues = [];

    this.add = function(name, value) {
        nameValues.push( {name: name, value: value} );
    };

    this.toQueryString = function() {
        var segments = [], nameValue;
        for (var i = 0, len = nameValues.length; i < len; i++) {
            nameValue = nameValues[i];
            segments[i] = encodeURIComponent(nameValue.name) + "=" + encodeURIComponent(nameValue.value);
        }
        return segments.join("&");
    };
}

var qsb = new QueryStringBuilder();
qsb.add("veg", "cabbage");
qsb.add("vegCount", "5");

alert( qsb.toQueryString() );

11

রেলস / পিএইচপি স্টাইল ক্যোয়ারী বিল্ডার

এই পদ্ধতিটি একটি জাভাস্ক্রিপ্ট অবজেক্টকে একটিতে রূপান্তর করে URI Query String। নেস্টেড অ্যারে এবং অবজেক্টগুলি (ইন Rails/ PHPসিনট্যাক্স) পরিচালনা করে:

function serializeQuery(params, prefix) {
  const query = Object.keys(params).map((key) => {
    const value  = params[key];

    if (params.constructor === Array)
      key = `${prefix}[]`;
    else if (params.constructor === Object)
      key = (prefix ? `${prefix}[${key}]` : key);

    if (typeof value === 'object')
      return serializeQuery(value, key);
    else
      return `${key}=${encodeURIComponent(value)}`;
  });

  return [].concat.apply([], query).join('&');
}

ব্যবহারের উদাহরণ:

let params = {
  a: 100,
  b: 'has spaces',
  c: [1, 2, 3],
  d: { x: 9, y: 8}
}

serializeQuery(params)
// returns 'a=100&b=has%20spaces&c[]=1&c[]=2&c[]=3&d[x]=9&d[y]=8

চমৎকার উদাহরণ। আমি আপনার উত্তরে একটি টাইপো স্থির করেছি। যাইহোক, মানগুলি functionবাদ দেওয়ার জন্য যদি আপনি সম্পাদনা করেন তবে তা আকর্ষণীয় হবে falsy(নাল, অপরিজ্ঞাত, NaN, '') ...
বিকাশকারী 0

8

JSON ব্যবহার করুন।

কীভাবে প্রয়োগ করা যায় সে সম্পর্কে ধারণাগুলির জন্য এই প্রশ্নটি একবার দেখুন ।


2
তিনি সার্ভারটি কী লিখছেন তা আমি জানি না, তবে বেশিরভাগ আধুনিক ভাষায় ভাল প্যাকেজ রয়েছে যা জেএসওএন পড়ে। তদুপরি, তিনি যদি এটি প্রয়োগ করে শেষ করেন তবে নিজের নিজস্ব একটি নতুন এনকোডিং স্কিম আবিষ্কার করার চেয়ে জেএসএন-রিডিং সার্ভার কোডটি প্রয়োগ করা ভাল। এর মতো ডিআইওয়াই এনকোডিংগুলি বগী হতে থাকে (কারণ আপনি সাধারণত সমস্ত সম্ভাব্য কেসগুলির মতো ভাবেন না, যেমন মানটি নিজেই একটি অ্যারে হিসাবে থাকে ইত্যাদি)।
অফরি রাভিভ

আপনি কি মূলত তেহ বস্তুকে JSON এ রূপান্তর করার পরামর্শ দিচ্ছেন এবং তারপরে পুরো JSON স্ট্রিংটিকে একক জিইটি কোয়েরি প্যারামিটার হিসাবে সার্ভারে পাস করবেন?
মার্কো ডেমাইও

8

গৃহীত উত্তরের কফিসিপি সংস্করণ এখানে। এটি কারও জন্য সময় সাশ্রয় করতে পারে।

serialize = (obj, prefix) ->
  str = []
  for p, v of obj
    k = if prefix then prefix + "[" + p + "]" else p
    if typeof v == "object"
      str.push(serialize(v, k))
    else
      str.push(encodeURIComponent(k) + "=" + encodeURIComponent(v))

  str.join("&")

ধন্যবাদ আলফোনসো! সত্যিই আমার সময় সাশ্রয়!
লুকাশ

6

এখানে অবজেক্ট.এন্ট্রিগুলির সাথে একটি সংক্ষিপ্ত এবং পুনরাবৃত্ত সংস্করণ । এটি নির্বিচারে নেস্টেড অ্যারেগুলি পরিচালনা করে তবে নেস্টেড বস্তুগুলি নয়। এটি খালি উপাদানগুলিও সরিয়ে দেয়:

const format = (k,v) => v !== null ? `${k}=${encodeURIComponent(v)}` : ''

const to_qs = (obj) => {
    return [].concat(...Object.entries(obj)
                       .map(([k,v]) => Array.isArray(v) 
                          ? v.map(arr => to_qs({[k]:arr})) 
                          : format(k,v)))
           .filter(x => x)
           .join('&');
}

উদাহরণ:

let json = { 
    a: [1, 2, 3],
    b: [],              // omit b
    c: 1,
    d: "test&encoding", // uriencode
    e: [[4,5],[6,7]],   // flatten this
    f: null,            // omit nulls
    g: 0
};

let qs = to_qs(json)

=> "a=1&a=2&a=3&c=1&d=test%26encoding&e=4&e=5&e=6&e=7&g=0"

নেস্টেড অ্যারেগুলি নিয়ে কাজ করার সময় এই সংস্করণটি আমার পক্ষে কাজ করেছে। রুবি / পিএইচপি-স্টাইলের অ্যারে কীগুলি ব্যবহার করতে একটি সামান্য ত্বক তৈরি করেছেন তবে অন্যথায় দুর্দান্ত কাজ করে।
নিকব

5

এটি নাল / অপরিজ্ঞাত মানগুলিকে এড়িয়ে চলে

export function urlEncodeQueryParams(data) {
    const params = Object.keys(data).map(key => data[key] ? `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}` : '');
    return params.filter(value => !!value).join('&');
}

5

ES7 এ আপনি এটি এক লাইনে লিখতে পারেন:

const serialize = (obj) => (Object.entries(obj).map(i => [i[0], encodeURIComponent(i[1])].join('=')).join('&'))

4

যদি কারও আবার প্রয়োজন হয় তবে অবজেক্টটিকে ক্যোরি স্ট্রিংয়ে রূপান্তর করতে একক লাইন

let Objs = { a: 'obejct-a', b: 'object-b' }

Object.keys(objs).map(key => key + '=' + objs[key]).join('&')

// result will be a=object-a&b=object-b

4

আমার একটি সহজ সমাধান রয়েছে যা কোনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে না এবং ইতিমধ্যে যে কোনও ব্রাউজারে "অবজেক্ট.কিজ" (ওরফে সমস্ত আধুনিক ব্রাউজার + প্রান্ত + অর্থাত্) রয়েছে এমন কোনও ব্রাউজারে ব্যবহারের জন্য প্রস্তুত:

ES5 এ

function(a){
    if( typeof(a) !== 'object' ) 
        return '';
    return `?${Object.keys(a).map(k=>`${k}=${a[k]}`).join('&')}`;
}

ES3 এ

function(a){
    if( typeof(a) !== 'object' ) 
        return '';
    return '?' + Object.keys(a).map(function(k){ return k + '=' + a[k] }).join('&');
}

3

আপনি যদি কোনও নেস্টেড অবজেক্টকে পুনরাবৃত্তভাবে রূপান্তর করতে চান এবং অবজেক্টটিতে অ্যারে থাকতে পারে এবং নাও থাকতে পারে (এবং অ্যারেতে অবজেক্টস বা অ্যারে ইত্যাদি থাকতে পারে), তবে সমাধানটি খানিকটা জটিল হয়ে যায়। এটি আমার চেষ্টা।

আপনি প্রতিটি অবজেক্ট সদস্যের জন্য এটি যে প্রধান অবজেক্টের অধীনে থাকে তার গভীরতা রেকর্ড করতে চান কিনা তা বেছে নিতে এবং রূপান্তরকারী অ্যারে থেকে আসা সদস্যগুলিতে আপনি কোনও লেবেল যুক্ত করতে চান কিনা তা বেছে নিতে আমি কয়েকটি বিকল্প যুক্ত করেছি।

জিনিসটির প্যারামিটারটি সত্যই কোনও বস্তু বা অ্যারে গ্রহণ করে কিনা তা আদর্শভাবে আপনার পরীক্ষা করা উচিত।

function thingToString(thing,maxDepth,recordLevel,markArrays){
    //thing: object or array to be recursively serialized
    //maxDepth (int or false):
    // (int) how deep to go with converting objects/arrays within objs/arrays
    // (false) no limit to recursive objects/arrays within objects/arrays
    //recordLevel (boolean):
    //  true - insert "(level 1)" before transcript of members at level one (etc)
    //  false - just 
    //markArrays (boolean):
    //  insert text to indicate any members that came from arrays
    var result = "";
    if (maxDepth !== false && typeof maxDepth != 'number') {maxDepth = 3;}
    var runningDepth = 0;//Keeps track how deep we're into recursion

    //First prepare the function, so that it can call itself recursively
    function serializeAnything(thing){
        //Set path-finder values
        runningDepth += 1;
        if(recordLevel){result += "(level " + runningDepth + ")";}

        //First convert any arrays to object so they can be processed
        if (thing instanceof Array){
            var realObj = {};var key;
            if (markArrays) {realObj['type'] = "converted array";}
            for (var i = 0;i < thing.length;i++){
                if (markArrays) {key = "a" + i;} else {key = i;}
                realObj[key] = thing[i];
            }
            thing = realObj;
            console.log('converted one array to ' + typeof realObj);
            console.log(thing);
        }

        //Then deal with it
        for (var member in thing){
            if (typeof thing[member] == 'object' && runningDepth < maxDepth){
                serializeAnything(thing[member]);
                //When a sub-object/array is serialized, it will add one to
                //running depth. But when we continue to this object/array's
                //next sibling, the level must go back up by one
                runningDepth -= 1;
            } else if (maxDepth !== false && runningDepth >= maxDepth) {
                console.log('Reached bottom');
            } else 
            if (
                typeof thing[member] == "string" || 
                typeof thing[member] == 'boolean' ||
                typeof thing[member] == 'number'
            ){
                result += "(" + member + ": " + thing[member] + ") ";
            }  else {
                result += "(" + member + ": [" + typeof thing[member] + " not supported]) ";
            }
        }
    }
    //Actually kick off the serialization
    serializeAnything(thing);

    return result;

}

পুনরাবৃত্তির পদ্ধতির জন্য ধন্যবাদ
শার্লক

3

গৃহীত সমাধানের জন্য সংযোজন, এটি অবজেক্টগুলির এবং অ্যারের সাথে কাজ করে:

parseJsonAsQueryString = function (obj, prefix, objName) {
    var str = [];
    for (var p in obj) {
        if (obj.hasOwnProperty(p)) {
            var v = obj[p];
            if (typeof v == "object") {
                var k = (objName ? objName + '.' : '') + (prefix ? prefix + "[" + p + "]" : p);
                str.push(parseJsonAsQueryString(v, k));
            } else {
                var k = (objName ? objName + '.' : '') + (prefix ? prefix + '.' + p : p);
                str.push(encodeURIComponent(k) + "=" + encodeURIComponent(v));
                //str.push(k + "=" + v);
            }
        }
    }
    return str.join("&");
}

এছাড়াও আপনি যদি অ্যাপ নেটওয়ান এমভিসি ক্রিয়া পদ্ধতিগুলির মতো অবজেক্ট পরামিতিগুলি ব্যবহার করছেন তবে অবজেক্ট নাম যুক্ত করেছেন।


3

খানিকটা ভাল দেখায়

objectToQueryString(obj, prefix) {
    return Object.keys(obj).map(objKey => {
        if (obj.hasOwnProperty(objKey)) {
            const key = prefix ? `${prefix}[${objKey}]` : objKey;
            const value = obj[objKey];

            return typeof value === "object" ?
                this.objectToQueryString(value, key) :
                `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
        }

        return null;
    }).join("&");
}

3

আমি জেএসএন স্ট্রিংফায়ারের তুলনা করেছি এবং ফলাফলগুলি নীচে রয়েছে:

JSON:    {"_id":"5973782bdb9a930533b05cb2","isActive":true,"balance":"$1,446.35","age":32,"name":"Logan Keller","email":"logankeller@artiq.com","phone":"+1 (952) 533-2258","friends":[{"id":0,"name":"Colon Salazar"},{"id":1,"name":"French Mcneil"},{"id":2,"name":"Carol Martin"}],"favoriteFruit":"banana"}
Rison:   (_id:'5973782bdb9a930533b05cb2',age:32,balance:'$1,446.35',email:'logankeller@artiq.com',favoriteFruit:banana,friends:!((id:0,name:'Colon Salazar'),(id:1,name:'French Mcneil'),(id:2,name:'Carol Martin')),isActive:!t,name:'Logan Keller',phone:'+1 (952) 533-2258')
O-Rison: _id:'5973782bdb9a930533b05cb2',age:32,balance:'$1,446.35',email:'logankeller@artiq.com',favoriteFruit:banana,friends:!((id:0,name:'Colon Salazar'),(id:1,name:'French Mcneil'),(id:2,name:'Carol Martin')),isActive:!t,name:'Logan Keller',phone:'+1 (952) 533-2258'
JSURL:   ~(_id~'5973782bdb9a930533b05cb2~isActive~true~balance~'!1*2c446.35~age~32~name~'Logan*20Keller~email~'logankeller*40artiq.com~phone~'*2b1*20*28952*29*20533-2258~friends~(~(id~0~name~'Colon*20Salazar)~(id~1~name~'French*20Mcneil)~(id~2~name~'Carol*20Martin))~favoriteFruit~'banana)
QS:      _id=5973782bdb9a930533b05cb2&isActive=true&balance=$1,446.35&age=32&name=Logan Keller&email=logankeller@artiq.com&phone=+1 (952) 533-2258&friends[0][id]=0&friends[0][name]=Colon Salazar&friends[1][id]=1&friends[1][name]=French Mcneil&friends[2][id]=2&friends[2][name]=Carol Martin&favoriteFruit=banana
URLON:   $_id=5973782bdb9a930533b05cb2&isActive:true&balance=$1,446.35&age:32&name=Logan%20Keller&email=logankeller@artiq.com&phone=+1%20(952)%20533-2258&friends@$id:0&name=Colon%20Salazar;&$id:1&name=French%20Mcneil;&$id:2&name=Carol%20Martin;;&favoriteFruit=banana
QS-JSON: isActive=true&balance=%241%2C446.35&age=32&name=Logan+Keller&email=logankeller%40artiq.com&phone=%2B1+(952)+533-2258&friends(0).id=0&friends(0).name=Colon+Salazar&friends(1).id=1&friends(1).name=French+Mcneil&friends(2).id=2&friends(2).name=Carol+Martin&favoriteFruit=banana

এর মধ্যে সংক্ষিপ্ততম হ'ল ইউআরএল অবজেক্ট নোটেশন


2

ঠিক আছে, এটি একটি পুরানো পোস্ট তবে আমি এই সমস্যার মুখোমুখি হয়েছি এবং আমি আমার ব্যক্তিগত সমাধান খুঁজে পেয়েছি .. সম্ভবত অন্য কাউকে সাহায্য করতে পারে ..

     function objToQueryString(obj){
        var k = Object.keys(obj);
        var s = "";
        for(var i=0;i<k.length;i++) {
            s += k[i] + "=" + encodeURIComponent(obj[k[i]]);
            if (i != k.length -1) s += "&";
        }
        return s;
     };

2

উপরের উত্তরগুলি পূরণ করে না যদি আপনার অনেক নেস্টেড অবজেক্ট থাকে। পরিবর্তে আপনি এখান থেকে ফাংশন পরম চয়ন করতে পারেন - https://github.com/ জ্ঞানসেকোড / জ্যাকোরি-param/blob/master/jquery-param.js এটি আমার পক্ষে খুব ভালভাবে কাজ করেছে!

    var param = function (a) {
    var s = [], rbracket = /\[\]$/,
        isArray = function (obj) {
            return Object.prototype.toString.call(obj) === '[object Array]';
        }, add = function (k, v) {
            v = typeof v === 'function' ? v() : v === null ? '' : v === undefined ? '' : v;
            s[s.length] = encodeURIComponent(k) + '=' + encodeURIComponent(v);
        }, buildParams = function (prefix, obj) {
            var i, len, key;

            if (prefix) {
                if (isArray(obj)) {
                    for (i = 0, len = obj.length; i < len; i++) {
                        if (rbracket.test(prefix)) {
                            add(prefix, obj[i]);
                        } else {
                            buildParams(prefix + '[' + (typeof obj[i] === 'object' ? i : '') + ']', obj[i]);
                        }
                    }
                } else if (obj && String(obj) === '[object Object]') {
                    for (key in obj) {
                        buildParams(prefix + '[' + key + ']', obj[key]);
                    }
                } else {
                    add(prefix, obj);
                }
            } else if (isArray(obj)) {
                for (i = 0, len = obj.length; i < len; i++) {
                    add(obj[i].name, obj[i].value);
                }
            } else {
                for (key in obj) {
                    buildParams(key, obj[key]);
                }
            }
            return s;
        };

    return buildParams('', a).join('&').replace(/%20/g, '+');
};

2

একটি জাভাস্ক্রিপ্ট অবজেক্টের উত্তর STRING এঙ্কোডিংয়ের জন্য ES6 সমাধান

const params = {
  a: 1,
  b: 'query stringify',
  c: null,
  d: undefined,
  f: '',
  g: { foo: 1, bar: 2 },
  h: ['Winterfell', 'Westeros', 'Braavos'],
  i: { first: { second: { third: 3 }}}
}

static toQueryString(params = {}, prefix) {
  const query = Object.keys(params).map((k) => {
    let key = k;
    const value = params[key];

    if (!value && (value === null || value === undefined || isNaN(value))) {
      value = '';
    }

    switch (params.constructor) {
      case Array:
        key = `${prefix}[]`;
        break;
      case Object:
        key = (prefix ? `${prefix}[${key}]` : key);
        break;
    }

    if (typeof value === 'object') {
      return this.toQueryString(value, key); // for nested objects
    }

    return `${key}=${encodeURIComponent(value)}`;
  });

  return query.join('&');
}

toQueryString (প্যারাম)

"a=1&b=query%20stringify&c=&d=&f=&g[foo]=1&g[bar]=2&h[]=Winterfell&h[]=Westeros&h[]=Braavos&i[first][second][third]=3"

2

এটি এমন একটি সমাধান যা বাক্স থেকে বাইরে নেট নেট ব্যাকেন্ডের জন্য কাজ করবে। আমি এই থ্রেডের প্রাথমিক উত্তর নিয়েছি এবং আমাদের। নেট প্রয়োজন অনুসারে এটি আপডেট করেছি।

function objectToQuerystring(params) {
var result = '';

    function convertJsonToQueryString(data, progress, name) {
        name = name || '';
        progress = progress || '';
        if (typeof data === 'object') {
            Object.keys(data).forEach(function (key) {
                var value = data[key];
                if (name == '') {
                    convertJsonToQueryString(value, progress, key);
                } else {
                    if (isNaN(parseInt(key))) {
                        convertJsonToQueryString(value, progress, name + '.' + key);
                    } else {
                        convertJsonToQueryString(value, progress, name + '[' + key+ ']');
                    }
                }
            })
        } else {
            result = result ? result.concat('&') : result.concat('?');
            result = result.concat(`${name}=${data}`);
        }
    }

    convertJsonToQueryString(params);
    return result;
}

1

আমি কেবল তার জন্য একটি প্যাকেজ লিখেছি: অবজেক্ট-ক্যোয়ারী-স্ট্রিং :)

নেস্টেড অবজেক্টস, অ্যারে, কাস্টম এনকোডিং ফাংশন ইত্যাদি সমর্থন করে হালকা ও জিকুয়েরি মুক্ত।

// TypeScript
import { queryString } from 'object-query-string';

// Node.js
const { queryString } = require("object-query-string");

const query = queryString({
    filter: {
        brands: ["Audi"],
        models: ["A4", "A6", "A8"],
        accidentFree: true
    },
    sort: 'mileage'
});

আয়

filter[brands][]=Audi&filter[models][]=A4&filter[models][]=A6&filter[models][]=A8&filter[accidentFree]=true&sort=milage

0

আর একটি উপায় (কোনও পুনরাবৃত্তিযোগ্য বস্তু নেই):

   getQueryString = function(obj)
   {
      result = "";

      for(param in obj)
         result += ( encodeURIComponent(param) + '=' + encodeURIComponent(obj[param]) + '&' );

      if(result) //it's not empty string when at least one key/value pair was added. In such case we need to remove the last '&' char
         result = result.substr(0, result.length - 1); //If length is zero or negative, substr returns an empty string [ref. http://msdn.microsoft.com/en-us/library/0esxc5wy(v=VS.85).aspx]

      return result;
   }

alert( getQueryString({foo: "hi there", bar: 123, quux: 2 }) );

0

উত্তরটি @ ব্যবহারকারী 187291 থেকে দেখুন, জেসন নেস্টেড অ্যারে রূপান্তরিত করতে প্যারামিটার হিসাবে "ইসআরে" যুক্ত করুন।

data : {
                    staffId : "00000001",
                    Detail : [ {
                        "identityId" : "123456"
                    }, {
                        "identityId" : "654321"
                    } ],

                }

ফলাফল করতে:

staffId = 00000001 & বিস্তারিত [0] .identityId = 123456 & বিস্তারিত [1] .identityId = 654321

serialize = function(obj, prefix, isArray) {
        var str = [],p = 0;
        for (p in obj) {
            if (obj.hasOwnProperty(p)) {
                var k, v;
                if (isArray)
                    k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
                else
                    k = prefix ? prefix + "." + p + "" : p, v = obj[p];

                if (v !== null && typeof v === "object") {
                    if (Array.isArray(v)) {
                        serialize(v, k, true);
                    } else {
                        serialize(v, k, false);
                    }
                } else {
                    var query = k + "=" + v;
                    str.push(query);
                }
            }
        }
        return str.join("&");
    };

    serialize(data, "prefix", false);

0

আপনি সাধারণ জাভাস্ক্রিপ্ট ব্যবহার করে এটি অর্জন করতে পারেন ।

const stringData = '?name=Nikhil&surname=Mahirrao&age=30';
    
const newData= {};
stringData.replace('?', '').split('&').map((value) => {
  const temp = value.split('=');
  newData[temp[0]] = temp[1];
});

console.log('stringData: '+stringData);
console.log('newData: ');
console.log(newData);


1
এটি একটি দুর্দান্ত অনুশীলন, তবে এটি অন্যান্য উপায়। প্রশ্নের উত্তর নয়।
ক্রিশ্চিয়ান ওয়েস্টারবিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.