FormData (HTML5 Object) को JSON में कैसे बदलें


104

HTML5 FormData ऑब्जेक्ट को JSON में कैसे बदलें? Jquery के बिना और ऑब्जेक्ट की तरह FormData में नेस्टेड गुणों से निपटने।


2
तुम क्या करने की कोशिश कर रहे हो? क्या JSON.stringify()मदद करता है? हो सकता है कि आप कुछ ऐसा करने की कोशिश करें जो अन्य तरीके से किया जा सकता है?
जस्टिनस


3
डुप्लिकेट नहीं है क्योंकि मैं एक जावास्क्रिप्ट ऑब्जेक्ट को एक जेन्स में बदलना नहीं चाहता, और न ही मैं Jquery.serialize () का उपयोग करना चाहता हूं
लियोनार्डो विलेला

जवाबों:


144

आप सीधे ऑब्जेक्ट 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:

यहाँ समाप्त होने वाले लोगों के लिए एक साइड नोट के रूप में, फॉर्म डेटा को जोंस में परिवर्तित करने का उद्देश्य एक XML HTTP अनुरोध के माध्यम से इसे एक सर्वर पर भेजना है, जिसे आप FormDataऑब्जेक्ट को सीधे रूपांतरित किए बिना भेज सकते हैं । इस रूप में सरल:

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

संदर्भ के लिए MDN पर FormData ऑब्जेक्ट्स का उपयोग करना भी देखें :

अद्यतन 4:

जैसा कि मेरे जवाब में नीचे दी गई टिप्पणियों में से एक में बताया गया है कि JSON stringifyपद्धति सभी प्रकार की वस्तुओं के लिए बॉक्स से बाहर काम नहीं करेगी। किस प्रकार का समर्थन किया जाता है, इस बारे में अधिक जानकारी के लिए, मैं MDN प्रलेखन में विवरण अनुभाग का उल्लेख करना चाहूंगाJSON.stringify

वर्णन में यह भी उल्लेख किया गया है कि:

यदि मान में एक toJSON () विधि है, तो यह परिभाषित करना ज़िम्मेदार है कि डेटा किस क्रम में होगा।

इसका मतलब है कि आप toJSONअपने कस्टम ऑब्जेक्ट्स को क्रमबद्ध करने के लिए तर्क के साथ अपनी खुद की क्रमांकन विधि की आपूर्ति कर सकते हैं । जैसे कि आप और अधिक आसानी से और अधिक जटिल ऑब्जेक्ट पेड़ों के लिए क्रमांकन समर्थन का निर्माण कर सकते हैं।


1
जैसा कि @TomasPrado से उत्तर में बताया गया है कि आपको IE11 के लिए समर्थन की आवश्यकता नहीं है।
विल्ट

4
यह मल्टी सेलेक्ट फॉर्म तत्वों के साथ काम नहीं करता है क्योंकि वे उसी कुंजी को साझा करते हैं जो आप केवल अंतिम चयनित तत्व को वापस करने वाले मानों को अधिलेखित करते हैं
सीन

1
@ सीन मैंने एक ऐसा जवाब दिया , जो मान को एक सरणी में परिवर्तित करके, एक ही नाम के साथ <SELECT MULTIPLE>और कई मानों के साथ काम करता है <INPUT type="checkbox">
कुछ

formData एक सेरी नहीं है। आप कैसे कर सकते हैं? जवाब स्वीकार किया लेकिन कुछ याद किया।
नूरी YILMAZ

4
जब तक मल्टी सिलेक्ट्स आदि की जरूरत न हो .. तब तक इसका उत्तर JSON.stringify(Object.fromEntries(formData));बहुत अच्छा है
टॉम स्टिकेल

108

2019 में, इस तरह का कार्य सुपर-आसान हो गया।

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

Object.fromEntries: क्रोम 73+, फ़ायरफ़ॉक्स 63+, सफारी 12.1 में समर्थित है


2
इसे पोस्ट करने के लिए यहां आया था, इस धागे को देखकर प्यार करता हूं और देख रहा हूं कि वर्षों के दौरान उत्तर कैसे विकसित हुए हैं
Marcin

13
यह उन रूपों पर सही ढंग से काम नहीं करता है जिनके समान नाम के साथ कई फ़ील्ड हैं।
जुक्काप

3
यह 2020 है और इस के कई चयनित मानों का प्रबंधन नहीं है <select multiple>या <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>


1
सबसे अच्छा जवाब यहाँ। धन्यवाद :)
चंकी चंक

4
मुझे वास्तव में यह उत्तर पसंद है लेकिन फिर भी कई वस्तुओं को संभालना नहीं है। मैंने उन मामलों को संभालने के लिए इस पर आधारित एक नया उत्तर पोस्ट किया।
कार्लोस

9

यदि आपके पास एक ही नाम के साथ कई प्रविष्टियाँ हैं, उदाहरण के लिए यदि आप उपयोग करते हैं <SELECT multiple>या <INPUT type="checkbox">एक ही नाम के साथ कई हैं , तो आपको इस बात का ध्यान रखना और मूल्य की एक सरणी बनाना होगा। अन्यथा आप केवल अंतिम चयनित मान प्राप्त करते हैं।

यहाँ आधुनिक ईएस 6-प्रकार है:

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 );
}

थोड़ा पुराना कोड (लेकिन अभी भी IE11 द्वारा समर्थित नहीं है, क्योंकि यह समर्थन नहीं करता है 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);

});

यह जुसन का उत्पादन नहीं करता है
लियाम

1
@ लिआम क्या आपने फॉर्म तत्वों के साथ इसकी कोशिश की है? और मुझे पता है कि यह JSON ऑब्जेक्ट का उत्पादन क्यों नहीं करता है?
गिरि

1
एक जोंस वस्तु जैसी कोई चीज नहीं है। Json एक स्ट्रिंग संकेतन है
Liam

1
@ लिम ने बनाई वस्तु के बाद वे JSON.stringify (परिणाम) का उपयोग कर सकते हैं। और मैंने अपना उत्तर संपादित कर दिया है। कृपया यह जाँचें। और डाउन वोट वापस लें।
गिरीबी

1
यदि आप 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 फॉर्मडैटा ऑब्जेक्ट से लेकर हर इट्रेशन में JSON कीज तक किया है।

आप इस कोड को मेरे जेएस लाइब्रेरी में GitHub पर मुझे सुझाएं अगर मुझे इसमें सुधार की आवश्यकता है तो मुझे कोड दिया गया है यहां https://github.com/alijamal14/Utilities/blob/master/Utilities.js


1
@ ज़ुलुक ने आपको धन्यवाद दिया
अली जमाल

यह कई चयनित मानों को संभालता नहीं है <select multiple>या नहीं <input type="checkbox">
कुछ

5

यह पोस्ट पहले से ही एक वर्ष पुराना है ... लेकिन, मुझे वास्तव में, वास्तव में ES6 @dzuc उत्तर पसंद है। हालाँकि यह कई चयनों या चेकबॉक्स को संभालने में सक्षम नहीं होने के कारण अधूरा है। यह पहले ही इंगित किया गया है और कोड समाधान की पेशकश की गई है। मैं उन्हें भारी लगता हूं और अनुकूलित नहीं। इसलिए मैंने इन मामलों को संभालने के लिए @dzuc पर आधारित 2 संस्करण लिखे:

  • एएसपी शैली रूपों के लिए, जहां कई आइटम नाम केवल सरल दोहराया जा सकता है।
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]}),{});
  • PHP शैली रूपों के लिए जहां कई आइटम नामों में []प्रत्यय होना चाहिए ।
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}),{});
  • PHP फॉर्म का विस्तार जो बहु-स्तरीय सरणियों का समर्थन करता है।

पिछली बार जब मैंने पिछला दूसरा मामला लिखा था, तब काम पर यह मामला आया था कि PHP के रूप में बहु-स्तरों पर चेकबॉक्स हैं। मैंने पिछले मामले और इस एक का समर्थन करने के लिए एक नया मामला लिखा था। मैंने इस मामले को बेहतर दिखाने के लिए एक स्निपेट बनाया, इस डेमो के लिए कंसोल पर परिणाम शो, इसे आपकी ज़रूरत के लिए संशोधित करें। प्रदर्शन के साथ समझौता किए बिना मैं इसे सर्वश्रेष्ठ रूप से अनुकूलित करने की कोशिश कर सकता हूं, हालांकि, यह कुछ मानव पठनीयता से समझौता करता है। यह लाभ उठाता है कि सरणियाँ ऑब्जेक्ट हैं और सरणियों को इंगित करने वाले चर को संदर्भ के रूप में रखा जाता है। इस एक के लिए कोई hotshot, मेरे मेहमान हो।

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>


2
Array.from(fd).reduce((obj, [k, v]) => ({...obj, [k]: v}), {});hotshot संस्करण es2018
nackjicholson

1
@nackjicholson Yeap, आप सही हैं, बंट रहे हैं .entries () और [k, v] तत्व कोड को सरल बनाते हैं। मैं इन सुधारों को शामिल करने के लिए कोड को फिर से लिखूंगा। हालाँकि आपका अभी भी दोहराया मूल्यों पर फिर से लिखना होगा।
कार्लोस

3
जबकि मैं प्रयास की सराहना करता हूं - कोड इस तरह से बेतुका है। कोई भी चर और वस्तुओं के लिए पत्र नहीं देखना चाहता है, यह 1985 नहीं है।
टॉम स्टिकेल

4

FormData विधि .entriesऔर for ofअभिव्यक्ति IE11 और Safari में समर्थित नहीं है

यहाँ सफारी, क्रोम, फ़ायरफ़ॉक्स और एज का समर्थन करने के लिए एक सरल संस्करण है

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

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

    return convertedJSON;
}

चेतावनी: यह उत्तर IE11 में काम नहीं करता है।
FormData forEachIE11 में एक विधि नहीं है ।
मैं अभी भी सभी प्रमुख ब्राउज़रों का समर्थन करने के लिए एक अंतिम समाधान खोज रहा हूं।


यह पूर्ण है! हमें पुराने ब्राउज़रों का समर्थन करना होगा और इटरेटर का उपयोग बहुत सहज नहीं है।
पीटर हॉकिन्स

3

यदि आप लॉश का उपयोग कर रहे हैं, तो इसे संक्षिप्त रूप से किया जा सकता है fromPairs

import {fromPairs} from 'lodash';

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

3

यदि आपको नेस्टेड फ़ील्ड्स को क्रमबद्ध करने के लिए समर्थन की आवश्यकता है, तो PHP कैसे फ़ील्ड्स को हैंडल करती है, आप निम्न फ़ंक्शन का उपयोग कर सकते हैं

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>


1
फ़ंक्शन अपडेट (डेटा, कुंजियों, मान) {"में" सरणी "[]" से "ऑब्जेक्ट" {}} के डिफ़ॉल्ट मान को अपडेट करने की आवश्यकता है। यह रिक्त सरणी समस्या को हटा देता है।
चिंतन मथुकिया

मैं अंतिम ऑब्जेक्ट से खाली खेतों को हटाने के लिए कम करने से पहले एक सरणी फिल्टर जोड़ने का सुझाव भी देता हूं
Ednilson Maia

@ChintanMathukiya Maia क्या आप अनपेक्षित आउटपुट के लिए नमूना इनपुट साझा कर सकते हैं?
जॉयस बाबू

@ ईडिलसन क्या आप नमूना डेटा साझा कर सकते हैं जिसके लिए आप खाली सरणी आउटपुट देख रहे हैं?
जॉयस बाबू

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

भले ही @dzuc का उत्तर पहले से ही बहुत अच्छा है, आप इसे और भी अधिक सुरुचिपूर्ण बनाने के लिए सरणी विनाशकारी (आधुनिक ब्राउज़रों में उपलब्ध या बैबेल के साथ) का उपयोग कर सकते हैं:

// 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

मैंने अब तक FormData.getAll पद्धति का कोई उल्लेख नहीं देखा है ।

एक FormData वस्तु के भीतर से सभी किसी कुंजी के साथ जुड़े मूल्यों लौटने इसके अलावा, इसे का उपयोग बहुत आसान हो जाता है 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>


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;
};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.