Простые способы преобразования данных формы в объект JSON [дубликат]

Цитирование спецификаций ECMAScript 6 (ECMAScript 2015), let и const, ,

. Эти переменные создаются, когда их содержащая лексическая среда создается но не может быть достигнут каким-либо образом до тех пор, пока не будет оценена LexicalBinding переменной.

Итак, чтобы ответить на ваш вопрос, да, let и const, но вы не можете получить к ним доступ до фактическая декларация оценивается во время выполнения.

21
задан Eugene Lisitsky 3 January 2017 в 08:34
поделиться

8 ответов

Вы также можете напрямую использовать forEach для объекта FormData:

var object = {};
formData.forEach(function(value, key){
    object[key] = value;
});
var json = JSON.stringify(object);
29
ответ дан Wilt 19 August 2018 в 12:41
поделиться
  • 1
    Серьезно, это лучшая реализация. Почему это не принятый ответ? – ARun32 2 December 2017 в 02:13
  • 2
    Как упоминалось в ответ от @TomasPrado, убедитесь, что вам не нужна поддержка IE11. – Wilt 23 February 2018 в 09:44
  • 3
    Это не работает с несколькими элементами формы выбора, поскольку они используют один и тот же ключ, в результате чего вы переписываете значения, возвращающие только последний выбранный элемент – Sean 2 April 2018 в 05:18
  • 4
    @Sean Я дал ответ, который работает с несколькими значениями для <SELECT MULTIPLE> и <INPUT type="checkbox"> с тем же именем, путем преобразования значения в массив. – some 14 April 2018 в 00:32
  • 5
    formData - это не серия. как вы можете итерации? принятый ответ, но что-то пропустило. – Nuri YILMAZ 28 June 2018 в 15:24

Простая в использовании функция

Я создал Функция для этого

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

В этом коде я создал пустую переменную JSON, используя цикл for. Я использовал key s от formData Object до JSON Keys в каждом Itration.

Вы нашли этот код в моей библиотеке JS на GitHub Do Suggest Мне, если он нуждается в улучшении, я разместил здесь код https://github.com/alijamal14/Utilities/blob/master/Utilities.js

4
ответ дан Ali Jamal 19 August 2018 в 12:41
поделиться

Вот способ сделать это в более функциональном стиле без использования библиотеки.

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>

3
ответ дан dzuc 19 August 2018 в 12:41
поделиться

Если вы используете lodash, это можно сделать кратко fromPairs

import {fromPairs} from 'lodash';

const object = fromPairs(Array.from(formData.entries()));
1
ответ дан Erik van Velzen 19 August 2018 в 12:41
поделиться

Вы можете достичь этого, используя объект FormData () . Этот объект FormData будет заполнен текущими ключами / значениями формы, используя свойство имени каждого элемента для ключей и их переданное значение для значений. Он также будет кодировать содержимое входного файла.

Пример:

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
ответ дан GiriB 19 August 2018 в 12:41
поделиться
  • 1
    Это не дает json – Liam 3 January 2017 в 09:54
  • 2
    @Liam Пробовали ли вы это с элементами формы? И дайте мне знать, почему он не создает объект JSON? – GiriB 3 January 2017 в 10:37
  • 3
    Нет такой вещи, как объект json. Json - это строковое обозначение – Liam 3 January 2017 в 11:13
  • 4
    @Liam После создания объекта они могут использовать JSON.stringify (result). И я отредактировал свой ответ. Пожалуйста, проверь это. И отозвать голос. – GiriB 3 January 2017 в 15:10
  • 5
    Вы также можете сделать выражение выражения более выразительным, если вы используете ES6: for (const [key, value] of formData.entries()) – Teddy Zetterlund 22 March 2017 в 09:15

Если у вас несколько записей с тем же именем, например, если вы используете <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 );
}

Немного более старый код (но все еще не поддерживается IE11, поскольку он не поддерживает ForEach или entries on 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 );
  }
1
ответ дан some 19 August 2018 в 12:41
поделиться

Метод FormData .entries и выражение for of не поддерживаются в IE11 и Safari.

Вот более простая версия для поддержки Safari, Chrome, Firefox и Edge

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

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

    return convertedJSON;
}

Внимание: этот ответ не работает в IE11. FormData не имеет метода forEach в IE11. Я все еще ищу окончательное решение для поддержки всех основных браузеров.

3
ответ дан Tomas Prado 19 August 2018 в 12:41
поделиться
  • 1
    это потрясающе! мы должны поддерживать старые браузеры, и использование итератора не очень интуитивно. – Peter Hawkins 4 December 2017 в 15:21
0
ответ дан Ivan Fretes 31 October 2018 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: