0

私はこのJavascriptオブジェクトを持っています(プラグインコードによってオンザフライで作成されます):

{
   "field": {
      "name": "Name",
      "surname": "Surname"
   },
   "address": {
      "street": "Street",
      "number": 0,
      "postcode": 0,
      "geo": {
        "city": "City",
        "country": "Country",   
        "state": "State"   
      }
   },
   "options": [1,4,6,8,11]
 }

このオブジェクトを JSON 文字列に変換したくはありませんが、このオブジェクトを別のオブジェクトに変換したいのですが、各フィールドは次のように文字列で表されます

{
  "field[name]": "Name",
  "field[surname]": "Surname",
  "address[street]": "Street",
  "address[number]": 0,
  "address[postcode]": 0,
  "address[geo][city]": "City",
  "address[geo][country]": "Country",   
  "address[geo][state]": "State",   
  "options[0]":1,
  "options[1]":4,
  "options[2]":6,
  "options[3]":8,
  "options[4]":11
}

シナリオ:

  • 元のオブジェクトがどのように見えるか (またはどのくらいの深さになるか) はわかりません。これはプラグインの一部であり、人々がどのようにフォームを構築するのかわかりません
  • JSONはファイルをアップロードできませんが、オブジェクトはFormDataアップロードできるため、オブジェクトのみを受け入れる場合は、この新しいオブジェクトをオブジェクト内に配置します。FormData
4

2 に答える 2

3

for...in コメントで述べたように、オブジェクトのプロパティを反復処理するには[MDN]ループが必要であり、再帰を使用してネストされたオブジェクトを後で変換できます。

function convert(obj, prefix, result) {
    result = result || {};

    // iterate over all properties
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            var value = obj[prop];
            // build the property name for the result object
            // first level is without square brackets
            var name = prefix ? prefix + '[' + prop + ']' : prop;
            if (typeof value !== 'object') {
                // not an object, add value to final result
                result[name] = value;
            }
            else {
                // object, go deeper
                convert(value, name, result);
            }
        }
    }

    return result;
}

// Usage:
var converted_data = convert(data);

デモ

それでも、JSON を使用することをお勧めします。

ファイルも処理したい場合は、Fileオブジェクトの追加チェックを追加する必要がある場合があります。結果オブジェクトでそれらを生にしたいでしょう:

else if (window.File && value instanceof File) {
    result[name] = value;
}

// and for file lists

else if (window.FileList && value instanceof FileList) {
    for (var i = 0, l = value.length; i < l; i++) {
        result[name + '[' + i + ']'] = value.item(i);
    }
}

FileIE では( ) コンストラクターの名前が異なっている可能性がありますが、FileListそれを参考にしてください。

于 2013-01-20T13:56:53.200 に答える