ফর্মডাটা (এইচটিএমএল 5 অবজেক্ট) কীভাবে JSON এ রূপান্তর করবেন


112

এইচটিএমএল 5 ফর্মডাটা অবজেক্টটিকে কীভাবে JSON এ রূপান্তর করবেন? Jquery এবং কোনও বস্তুর মতো ফর্মডাটাতে নেস্টেড বৈশিষ্ট্যগুলি পরিচালনা করা ছাড়াই।


4
আপনি কি করতে চেষ্টা করছেন? নেই JSON.stringify()সাহায্য করে? হয়তো আপনি এমন কিছু ঠিক করার চেষ্টা করছেন যা অন্যভাবে করা যেতে পারে?
জাস্টিনাস


4
সদৃশ নয় যেহেতু আমি জাভাস্ক্রিপ্ট অবজেক্টটিকে কোনও জসনে রূপান্তর করতে চাই না, এবং আমি Jquery.serialize () ব্যবহার করতে চাই না
লিওনার্দো ভিলেলা

: এই পরীক্ষা stackoverflow.com/a/39248551/6293856
Bhavik Hirani

উত্তর:


158

এছাড়াও আপনি ব্যবহার করতে পারে forEachউপর FormDataবস্তু সরাসরি:

var object = {};
formData.forEach(function(value, key){
    object[key] = value;
});
var json = JSON.stringify(object);

হালনাগাদ:

এবং যারা ES6 তীর ফাংশনগুলির সাথে একই সমাধান পছন্দ করেন তাদের জন্য :

var object = {};
formData.forEach((value, key) => object[key] = value);
var json = JSON.stringify(object);

আপডেট 2:

এবং যারা একাধিক মান সহ বহু নির্বাচনী তালিকা বা অন্যান্য ফর্ম উপাদানগুলির সমর্থন চান তাদের জন্য (যেহেতু এই ইস্যু সম্পর্কিত উত্তরের নীচে অনেক মন্তব্য রয়েছে আমি একটি সম্ভাব্য সমাধান যোগ করব) :

var object = {};
formData.forEach((value, key) => {
    // Reflect.has in favor of: object.hasOwnProperty(key)
    if(!Reflect.has(object, key)){
        object[key] = value;
        return;
    }
    if(!Array.isArray(object[key])){
        object[key] = [object[key]];    
    }
    object[key].push(value);
});
var json = JSON.stringify(object);

এখানে একটি ফিডল একটি সাধারণ বহু নির্বাচনী তালিকা সহ এই পদ্ধতিটির ব্যবহার প্রদর্শন করছে।

আপডেট 3:

এখানে শেষ হওয়া ব্যক্তিদের পক্ষে পার্শ্ব নোট হিসাবে, ফর্ম ডেটাটিকে জসন-এ রূপান্তর করার উদ্দেশ্যটি কোনও এক্সএমএল এইচটিটিপি অনুরোধের মাধ্যমে সার্ভারে প্রেরণ করা আপনি FormDataঅবজেক্টটিকে রূপান্তর না করে সরাসরি প্রেরণ করতে পারবেন । এই হিসাবে সহজ:

var request = new XMLHttpRequest();
request.open("POST", "http://example.com/submitform.php");
request.send(formData);

দেখুন এছাড়াও ব্যবহার FormData অবজেক্টস রেফারেন্সের জন্য MDN উপর :

আপডেট 4:

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

বর্ণনায় আরও উল্লেখ করা হয়েছে যে:

যদি মানটির একটি toJSON () পদ্ধতি থাকে তবে কোন ডেটাটি ক্রমিক করা হবে তা নির্ধারণ করার জন্য এটি দায়বদ্ধ।

এর অর্থ হ'ল আপনি নিজের toJSONকাস্টম অবজেক্টগুলিকে সিরিয়ালাইজ করার জন্য যুক্তি দিয়ে নিজের সিরিয়ালাইজেশন পদ্ধতি সরবরাহ করতে পারেন । এর মতো আপনি আরও জটিল বস্তু গাছগুলির জন্য দ্রুত এবং সহজেই সিরিয়ালাইজেশন সমর্থন তৈরি করতে পারেন।


4
@ টমাসপ্রাডোর উত্তরে উল্লিখিত হিসাবে নিশ্চিত করুন যে আইই 11 এর জন্য আপনার সমর্থন দরকার নেই।
উইল্ট করুন

4
এটি মাল্টি সিলেক্ট ফর্ম উপাদানগুলির সাথে কাজ করে না কারণ তারা একই কীটি ভাগ করে আপনি কেবলমাত্র শেষ নির্বাচিত উপাদানটি ফেরত মানগুলি ওভাররাইট করে
শান

4
@ শিয়ান আমি একটি উত্তর দিয়েছি যা একাধিক মান <SELECT MULTIPLE>এবং <INPUT type="checkbox">একই নামের সাথে কাজ করে, মানটিকে অ্যারেতে রূপান্তর করে।
কিছু

formData কোনও সিরি নয় ie আপনি কিভাবে পুনরাবৃত্তি করতে পারেন? উত্তর গৃহীত তবে কিছু মিস হয়েছে।
নূরী ইলমাজ

4
মাল্টি সিলেক্ট ইত্যাদির জন্য যদি না হয় তবে উত্তরটি JSON.stringify(Object.fromEntries(formData));এত সুন্দর হয়
টম স্টিকেল

112

2019 সালে, এই জাতীয় কাজটি অতি-সহজ হয়ে ওঠে।

JSON.stringify(Object.fromEntries(formData));

Object.fromEntries: ক্রোম 73+, ফায়ারফক্স 63+, সাফারি 12.1 এ সমর্থিত


4
এটি পোস্ট করতে এখানে এসেছিলেন, এই থ্রেডটি দেখে এবং বছরগুলিতে উত্তরগুলি কীভাবে বিকশিত হয়েছে তা দেখে ভালোবাসি
মার্সিন

14
এটি একই নামের একাধিক ক্ষেত্র রয়েছে এমন ফর্মগুলিতে সঠিকভাবে কাজ করছে বলে মনে হয় না।
JukkaP

4
এটি 2020 এবং এটি একাধিক নির্বাচিত মানগুলি <select multiple>বা handle এর সাথে পরিচালনা করে না<input type="checkbox">
কিছু

4
ব্যবহারের formData.entries ভাল:JSON.stringify(Object.fromEntries(formData.entries()));
Kohver

22

এটি একটি লাইব্রেরি ব্যবহার না করে আরও কার্যকরী শৈলীতে করার একটি উপায়।

Array.from(formData.entries()).reduce((memo, pair) => ({
  ...memo,
  [pair[0]]: pair[1],
}), {});

উদাহরণ:

document.getElementById('foobar').addEventListener('submit', (e) => {
  e.preventDefault();

  const formData = new FormData(e.target);
  const data = Array.from(formData.entries()).reduce((memo, pair) => ({
    ...memo,
    [pair[0]]: pair[1],
  }), {});
  document.getElementById('output').innerHTML = JSON.stringify(data);
});
<form id='foobar'>
  <input name='baz' />
  <input type='submit' />
</form>

<pre id='output'>Input some value and submit</pre>


4
এখানে সেরা উত্তর। ধন্যবাদ :)
চুঙ্কি

4
আমি এই উত্তরটি সত্যিই পছন্দ করি তবে এখনও একাধিক আইটেম পরিচালনা করি না। আমি এই কেসগুলি পরিচালনা করতে এটির ভিত্তিতে একটি নতুন উত্তর পোস্ট করেছি posted
কার্লোস

10

আপনার যদি একই নামের একাধিক এন্ট্রি থাকে, উদাহরণস্বরূপ যদি আপনি একই নামের সাথে <SELECT multiple>একাধিক ব্যবহার করেন বা থাকেন তবে আপনাকে সেটির <INPUT type="checkbox">যত্ন নিতে হবে এবং মানটির একটি অ্যারে তৈরি করতে হবে। অন্যথায় আপনি কেবল সর্বশেষ নির্বাচিত মান পাবেন।

আধুনিক ES6- রূপটি এখানে:

function formToJSON( elem ) {
  let output = {};
  new FormData( elem ).forEach(
    ( value, key ) => {
      // Check if property already exist
      if ( Object.prototype.hasOwnProperty.call( output, key ) ) {
        let current = output[ key ];
        if ( !Array.isArray( current ) ) {
          // If it's not an array, convert it to an array.
          current = output[ key ] = [ current ];
        }
        current.push( value ); // Add the new value to the array.
      } else {
        output[ key ] = value;
      }
    }
  );
  return JSON.stringify( output );
}

সামান্য পুরানো কোড (তবে এখনও আই 11 সমর্থন করে না, যেহেতু এটি সমর্থন করে না ForEachবা entriesচালু করে না FormData)

function formToJSON( elem ) {
  var current, entries, item, key, output, value;
  output = {};
  entries = new FormData( elem ).entries();
  // Iterate over values, and assign to item.
  while ( item = entries.next().value )
    {
      // assign to variables to make the code more readable.
      key = item[0];
      value = item[1];
      // Check if key already exist
      if (Object.prototype.hasOwnProperty.call( output, key)) {
        current = output[ key ];
        if ( !Array.isArray( current ) ) {
          // If it's not an array, convert it to an array.
          current = output[ key ] = [ current ];
        }
        current.push( value ); // Add the new value to the array.
      } else {
        output[ key ] = value;
      }
    }
    return JSON.stringify( output );
  }

7

আপনি ফর্মডেটা () অবজেক্টটি ব্যবহার করে এটি অর্জন করতে পারেন । এই ফর্ম্যাডাটা অবজেক্টটি কীগুলির জন্য প্রতিটি উপাদানের নাম সম্পত্তি এবং মানগুলির জন্য তাদের জমা দেওয়া মান ব্যবহার করে ফর্মের বর্তমান কী / মানগুলির সাথে পপুলেটে যাবে। এটি ফাইল ইনপুট সামগ্রী এনকোড করবে।

উদাহরণ:

var myForm = document.getElementById('myForm');
myForm.addEventListener('submit', function(event)
{
    event.preventDefault();
    var formData = new FormData(myForm),
        result = {};

    for (var entry of formData.entries())
    {
        result[entry[0]] = entry[1];
    }
    result = JSON.stringify(result)
    console.log(result);

});

এটি জেসন তৈরি করে না
লিয়াম

4
@ লিয়াম আপনি কি ফর্ম উপাদান দিয়ে চেষ্টা করেছেন? এবং আমাকে জানতে দিন কেন এটি JSON অবজেক্টটি উত্পাদন করে না?
গিরিবি

4
জসন অবজেক্টের মতো কোনও জিনিস নেই। জসন একটি স্ট্রিং স্বরলিপি
লিয়াম

4
@ লিয়াম বস্তুটি তৈরি করার পরে তারা JSON.stringify (ফলাফল) ব্যবহার করতে পারে। এবং আমি আমার উত্তর সম্পাদনা করেছি। দয়া করে এটি পরীক্ষা করুন। এবং ডাউন ভোট প্রত্যাহার করুন।
গিরিবি

4
আপনি যদি ES6 ব্যবহার করে থাকেন তবে আপনি বিবৃতিটি আরও সংবেদনশীল করতে পারেন: for (const [key, value] of formData.entries())
টেডি জেটারলুন্ড

7

ফাংশন ব্যবহার করা সহজ

আমি এটির জন্য একটি ফাংশন তৈরি করেছি

function FormDataToJSON(FormElement){    
    var formData = new FormData(FormElement);
    var ConvertedJSON= {};
    for (const [key, value]  of formData.entries())
    {
        ConvertedJSON[key] = value;
    }

    return ConvertedJSON
}

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

var ReceivedJSON = FormDataToJSON(document.getElementById('FormId');)

এই কোডটিতে forআমি ফাঁকা JSON ভেরিয়েবলটি লুপ ব্যবহার করে তৈরি করেছি আমি keyপ্রতিটি ইট্রেশনে ফর্মডাটা অবজেক্ট থেকে জেএসএন কীগুলিতে ব্যবহার করেছি।

আপনি এই কোডটি আমার জেএস লাইব্রেরিতে গীটহাবটিতে সন্ধান করেন যদি উন্নতির প্রয়োজন হয় তবে আমাকে পরামর্শ দিন আমাকে কোডটি এখানে রেখেছেন https://github.com/alijamal14/ ইউটিলিটিস / ব্লব / মাস্টার / ইউটিলিটিস.জেএস


4
@ জুলুক ব্যাখ্যা করেছেন ধন্যবাদ
আলী জামাল

এটি <select multiple>বা এর একাধিক নির্বাচিত মানগুলি পরিচালনা করে না <input type="checkbox">
কিছু

5

এই পোস্টটি ইতিমধ্যে এক বছরের পুরানো ... তবে, আমি সত্যিই, সত্যিই ES6 @dzuc উত্তরটি পছন্দ করি। তবে একাধিক নির্বাচন বা চেকবক্সগুলি পরিচালনা করতে সক্ষম না হয়ে এটি অসম্পূর্ণ। এটি ইতিমধ্যে নির্দেশ করেছে এবং কোড সমাধান সরবরাহ করা হয়েছে। আমি তাদের ভারী এবং অনুকূলিত না। সুতরাং আমি এই মামলাগুলি পরিচালনা করতে @dzuc এর উপর ভিত্তি করে একটি দুটি সংস্করণ লিখেছি:

  • এএসপি শৈলীর ফর্মগুলির জন্য যেখানে একাধিক আইটেমের নাম কেবল সহজ পুনরাবৃত্তি হতে পারে।
let r=Array.from(fd).reduce(
  (o , [k,v]) => (
     (!o[k])
     ? {...o , [k] : v}
     : {...o , [k] : [...o[k] , v]}
   )
   ,{}
);
let obj=JSON.stringify(r);

এক লাইন হটশট সংস্করণ:

Array.from(fd).reduce((o,[k,v])=>((!o[k])?{...o,[k]:v}:{...o,[k]:[...o[k],v]}),{});
  • পিএইচপি স্টাইলের ফর্মগুলির জন্য যেখানে একাধিক আইটেমের নামের একটি []প্রত্যয় থাকতে হবে।
let r=Array.from(fd).reduce(
  (o , [k,v]) => (
    (k.split('[').length>1)
    ? (k=k.split('[')[0]
      , (!o[k])
      ? {...o , [k] : [v]}
      : {...o , [k] : [...o[k] , v ]}
    )
    : {...o , [k] : v}
  )
  ,{}
);
let obj=JSON.stringify(r);

এক লাইন হটশট সংস্করণ:

Array.from(fd).reduce((o,[k,v])=>((k.split('[').length>1)?(k=k.split('[')[0],(!o[k])?{...o,[k]:[v]}:{...o,[k]:[...o[k],v]}):{...o,[k]:v}),{});
  • মাল্টি-লেভেল অ্যারেগুলিকে সমর্থন করে এমন পিএইচপি ফর্মের সম্প্রসারণ।

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

let nosubmit = (e) => {
  e.preventDefault();
  const f = Array.from(new FormData(e.target));
  const obj = f.reduce((o, [k, v]) => {
    let a = v,
      b, i,
      m = k.split('['),
      n = m[0],
      l = m.length;
    if (l > 1) {
      a = b = o[n] || [];
      for (i = 1; i < l; i++) {
        m[i] = (m[i].split(']')[0] || b.length) * 1;
        b = b[m[i]] = ((i + 1) == l) ? v : b[m[i]] || [];
      }
    }
    return { ...o, [n]: a };
  }, {});
  console.log(obj);
}
document.querySelector('#theform').addEventListener('submit', nosubmit, {capture: true});
<h1>Multilevel Form</h1>
<form action="#" method="POST" enctype="multipart/form-data" id="theform">
  <input type="hidden" name="_id" value="93242" />
  <input type="hidden" name="_fid" value="45c0ec96929bc0d39a904ab5c7af70ef" />
  <label>Select:
    <select name="uselect">
      <option value="A">A</option>
      <option value="B">B</option>
      <option value="C">C</option>
    </select>
  </label>
  <br /><br />
  <label>Checkboxes one level:<br/>
    <input name="c1[]" type="checkbox" checked value="1"/>v1 
    <input name="c1[]" type="checkbox" checked value="2"/>v2
    <input name="c1[]" type="checkbox" checked value="3"/>v3
  </label>
  <br /><br />
  <label>Checkboxes two levels:<br/>
    <input name="c2[0][]" type="checkbox" checked value="4"/>0 v4 
    <input name="c2[0][]" type="checkbox" checked value="5"/>0 v5
    <input name="c2[0][]" type="checkbox" checked value="6"/>0 v6
    <br/>
    <input name="c2[1][]" type="checkbox" checked value="7"/>1 v7 
    <input name="c2[1][]" type="checkbox" checked value="8"/>1 v8
    <input name="c2[1][]" type="checkbox" checked value="9"/>1 v9
  </label>
  <br /><br />
  <label>Radios:
    <input type="radio" name="uradio" value="yes">YES
    <input type="radio" name="uradio" checked value="no">NO
  </label>
  <br /><br />
  <input type="submit" value="Submit" />
</form>


4
Array.from(fd).reduce((obj, [k, v]) => ({...obj, [k]: v}), {});হটশট সংস্করণ es2018
ন্যাকজিচলসন

4
@ ন্যাকজিচলসন ইয়াপ, আপনি ঠিক বলেছেন, .entries () বাদ দিচ্ছেন এবং [কে, ভি] উপাদানটি কোডটি সহজ করুন। আমি এই উন্নতিগুলি অন্তর্ভুক্ত করার জন্য কোডটি পুনরায় লিখব। তবে আপনার এখনও পুনরাবৃত্তি মানগুলি ওভাররাইট হবে।
কার্লোস

4
যদিও আমি চেষ্টাটির প্রশংসা করি - এই জাতীয় কোডটি অযৌক্তিক। কেউ ভেরিয়েবল এবং অবজেক্টের জন্য চিঠি দেখতে চান না, এটি 1985 নয়
টম স্টিকেল

4

আইএম 11 .entriesএবং সাফারিতে ফর্মডাটা পদ্ধতি এবং for ofঅভিব্যক্তি সমর্থিত নয়

সাফারি, ক্রোম, ফায়ারফক্স এবং এজকে সমর্থন করার জন্য এখানে একটি সহজ সংস্করণ

function formDataToJSON(formElement) {    
    var formData = new FormData(formElement),
        convertedJSON = {};

    formData.forEach(function(value, key) { 
        convertedJSON[key] = value;
    });

    return convertedJSON;
}

সতর্কতা: এই উত্তর IE11 তে কাজ করে না।
ফর্মড্যাটার forEachআইই 11 তে কোনও পদ্ধতি নেই।
আমি এখনও সমস্ত বড় ব্রাউজারগুলিকে সমর্থন করার জন্য একটি চূড়ান্ত সমাধান অনুসন্ধান করছি।


এই নিখুঁত! আমাদের পুরানো ব্রাউজারগুলিকে সমর্থন করতে হবে এবং পুনরায় ব্যবহারকারীর ব্যবহার খুব স্বজ্ঞাত নয়।
পিটার হকিন্স

4

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

function update(data, keys, value) {
  if (keys.length === 0) {
    // Leaf node
    return value;
  }

  let key = keys.shift();
  if (!key) {
    data = data || [];
    if (Array.isArray(data)) {
      key = data.length;
    }
  }

  // Try converting key to a numeric value
  let index = +key;
  if (!isNaN(index)) {
    // We have a numeric index, make data a numeric array
    // This will not work if this is a associative array 
    // with numeric keys
    data = data || [];
    key = index;
  }
  
  // If none of the above matched, we have an associative array
  data = data || {};

  let val = update(data[key], keys, value);
  data[key] = val;

  return data;
}

function serializeForm(form) {
  return Array.from((new FormData(form)).entries())
    .reduce((data, [field, value]) => {
      let [_, prefix, keys] = field.match(/^([^\[]+)((?:\[[^\]]*\])*)/);

      if (keys) {
        keys = Array.from(keys.matchAll(/\[([^\]]*)\]/g), m => m[1]);
        value = update(data[prefix], keys, value);
      }
      data[prefix] = value;
      return data;
    }, {});
}

document.getElementById('output').textContent = JSON.stringify(serializeForm(document.getElementById('form')), null, 2);
<form id="form">
  <input name="field1" value="Field 1">
  <input name="field2[]" value="Field 21">
  <input name="field2[]" value="Field 22">
  <input name="field3[a]" value="Field 3a">
  <input name="field3[b]" value="Field 3b">
  <input name="field3[c]" value="Field 3c">
  <input name="field4[x][a]" value="Field xa">
  <input name="field4[x][b]" value="Field xb">
  <input name="field4[x][c]" value="Field xc">
  <input name="field4[y][a]" value="Field ya">
  <input name="field5[z][0]" value="Field z0">
  <input name="field5[z][]" value="Field z1">
  <input name="field6.z" value="Field 6Z0">
  <input name="field6.z" value="Field 6Z1">
</form>

<h2>Output</h2>
<pre id="output">
</pre>


4
ফাংশন আপডেট (ডেটা, কী, মান) in "ইনটাকে" {। "অবজেক্ট করতে অ্যারে" [] "থেকে" ডেটা "এর ডিফল্ট মান আপডেট করা দরকার এটি খালি অ্যারের সমস্যাটি সরিয়ে দেয়।
চিন্তন মাথুকিয়া

চূড়ান্ত বস্তুটি থেকে খালি ক্ষেত্রগুলি সরাতে হ্রাস করার আগে আমি অ্যারে ফিল্টার যুক্ত করার পরামর্শ দিই
এডনিসন মিয়া

@ চিন্তনমঠুকিয়া মিয়া আপনি যে নমুনা ইনপুটটির জন্য অপ্রত্যাশিত আউটপুট নিয়ে আসছেন তা কি ভাগ করে নিতে পারবেন?
জয়স বাবু

@ এডনলসন আপনি যে নমুনাটির জন্য খালি অ্যারে আউটপুটটি দেখছেন তা ভাগ করতে পারবেন?
জয়স বাবু

3

আপনি যদি লোডাশ ব্যবহার করছেন তবে এটি সংক্ষিপ্তভাবে সম্পন্ন করা যেতে পারে fromPairs

import {fromPairs} from 'lodash';

const object = fromPairs(Array.from(formData.entries()));

2

আপনি এটি চেষ্টা করতে পারেন

formDataToJSON($('#form_example'));

# Create a function to convert the serialize and convert the form data
# to JSON
# @param : $('#form_example');
# @return a JSON Stringify
function formDataToJSON(form) {
    let obj = {};
    let formData = form.serialize();
    let formArray = formData.split("&");

    for (inputData of formArray){
        let dataTmp = inputData.split('=');
        obj[dataTmp[0]] = dataTmp[1];
    }
    return JSON.stringify(obj);
}

2

যদিও @ ডিজুকের উত্তর ইতিমধ্যে খুব ভাল, আপনি আরও কিছুটা মার্জিত করতে আপনি অ্যারে ডিস্ট্রাকচার (আধুনিক ব্রাউজারগুলিতে বা ব্যাবেলের সাথে উপলব্ধ) ব্যবহার করতে পারেন:

// original version from @dzuc
const data = Array.from(formData.entries())
  .reduce((memo, pair) => ({
    ...memo,
    [pair[0]: pair[1],
  }), {})

// with array destructuring
const data = Array.from(formData.entries())
  .reduce((memo,[key, value]) => ({
    ...memo,
    [key]: value,
  }), {})

2

আপত্তিজনক ওয়ান-লাইনার!

Array.from(fd).reduce((obj, [k, v]) => ({...obj, [k]: v}), {});

আজ আমি শিখেছি ফায়ারফক্সের স্প্রেড সাপোর্ট এবং অ্যারে ডেস্ট্রাকচারিং রয়েছে!


1

নিম্নলিখিত আইটেমগুলি আপনার চাহিদা পূরণ করে, আপনি ভাগ্য:

  1. আপনি যেমন অ্যারের অ্যারেগুলিকে রূপান্তর করতে চান [['key','value1'], ['key2','value2'](যেমন ফর্মডাটা আপনাকে যা দেয়) একটি কী-> মান অবজেক্টে রূপান্তরিত করতে চান{key1: 'value1', key2: 'value2'} রূপান্তর করতে এবং এটিকে JSON স্ট্রিংয়ে রূপান্তর করতে চান।
  2. আপনি সর্বশেষতম ES6 দোভাষীর সাহায্যে ব্রাউজারগুলি / ডিভাইসগুলিকে টার্গেট করছেন বা বাবেলের মতো কিছু সংকলন করছেন।
  3. আপনি এটি সম্পাদন করার সবচেয়ে ক্ষুদ্রতম উপায় চান।

আপনার প্রয়োজনীয় কোডটি এখানে:

const data = new FormData(document.querySelector('form'));
const json = JSON.stringify(Array.from(data).reduce((o,[k,v])=>(o[k]=v,o),{}));

আশা করি এটি কাউকে সাহায্য করবে।


1

আমি ফর্মডাটা.জেটএল এর কোনও উল্লেখ দেখিনি পদ্ধতির ।

একটি ফর্মডাটা অবজেক্টের মধ্যে থেকে প্রদত্ত কীটির সাথে সম্পর্কিত সমস্ত মানগুলি ফেরত দেওয়ার পাশাপাশি, অন্যদের দ্বারা নির্দিষ্ট করা হিসাবে Object.fromEntries পদ্ধতিটি ব্যবহার করে এটি সত্যিই সহজ হয়ে যায়।

var formData = new FormData(document.forms[0])

var obj = Object.fromEntries(
  Array.from(formData.keys()).map(key => [
    key, formData.getAll(key).length > 1 ? 
      formData.getAll(key) : formData.get(key)
  ])
)

অ্যাকশনে স্নিপেট

var formData = new FormData(document.forms[0])

var obj = Object.fromEntries(Array.from(formData.keys()).map(key => [key, formData.getAll(key).length > 1 ? formData.getAll(key) : formData.get(key)]))

document.write(`<pre>${JSON.stringify(obj)}</pre>`)
<form action="#">
  <input name="name" value="Robinson" />
  <input name="items" value="Vin" />
  <input name="items" value="Fromage" />
  <select name="animals" multiple id="animals">
    <option value="tiger" selected>Tigre</option>
    <option value="turtle" selected>Tortue</option>
    <option value="monkey">Singe</option>
  </select>
</form>


1

আমি মনে করি formDataফর্মডাটা অবজেক্ট থেকে আপনি যে ফলাফলটি চান তা পাওয়ার সহজতম উপায় :

const jsonData = {};

for(const [key, value] of formData) {
    jsonData[key] = value;
}

0

আমার জন্য কাজ করেছেন

                var myForm = document.getElementById("form");
                var formData = new FormData(myForm),
                obj = {};
                for (var entry of formData.entries()){
                    obj[entry[0]] = entry[1];
                }
                console.log(obj);

এটা তোলে একাধিক নির্বাচিত মানের হ্যান্ডেল করা হবে না <select multiple>বা<input type="checkbox">
কিছু

0

আমার ক্ষেত্রে ফর্ম ডেটা ছিল ডেটা, ফায়ার বেসটি কোনও অবজেক্টের প্রত্যাশা করছিল তবে ডেটাতে অবজেক্টের পাশাপাশি অন্যান্য সমস্ত স্টাফ রয়েছে তাই আমি ডেটা চেষ্টা করেছিলাম।এটি কাজ করে!


0

আমি এখানে দেরিতে পৌঁছে যাচ্ছি। তবে, আমি একটি সহজ পদ্ধতি তৈরি করেছি যা ইনপুট টাইপ = "চেকবক্স" পরীক্ষা করে

var formData = new FormData($form.get(0));
        var objectData = {};
        formData.forEach(function (value, key) {
            var updatedValue = value;
            if ($('input[name="' + key + '"]').attr("type") === "checkbox" && $('input[name="' + key + '"]').is(":checked")) {
                updatedValue = true; // we don't set false due to it is by default on HTML
            }
            objectData[key] = updatedValue;
        });
var jsonData = JSON.stringify(objectData);

আমি আশা করি এটি অন্য কাউকে সাহায্য করবে।


-1

বিশেষ কিছু ব্যবহার না করে আপনি সহজেই এই কাজটি করতে পারেন। নীচের মত একটি কোড যথেষ্ট হবে।

var form = $(e.currentTarget);

var formData = objectifyForm(form);


function objectifyForm(formArray) {

    var returnArray = {};
    for (var i = 0; i < formArray[0].length; i++) {
        var name = formArray[0][i]['name'];
        if (name == "") continue;
        if (formArray[0][i]['type'] == "hidden" && returnArray[name] != undefined) continue;
        if ($(formArray[0][i]).attr("type") == "radio") {
            var radioInputs = $("[name='" + name + "']");
            var value = null;
            radioInputs.each(function (radio) {
                if ($(this)[0].checked == true) {
                    value = $(this).attr("id").split("_")[$(this).attr("id").split("_").length - 1];
                }
            });
            returnArray[name] = value;
        }
        else if ($(formArray[0][i]).attr("type") == "checkbox") {
            returnArray[name] = $(formArray[0][i])[0].checked;
        }
        else
            returnArray[name] = formArray[0][i]['value'];
    }



    return returnArray;
};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.