2013-01-20 109 views
0

我有这样的Javascript对象(即上即时通过我的插件代码创建)一个括号字符串(不透过JSON.stringify):把一个对象

{ 
    "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 
} 

场景:

  • 我不知道原始对象看起来会如何(或者会有多深),因为它是插件的一部分,我不知道人们将如何构建它们的表格
  • 我打算把这个一个FormData对象中的新对象,如果只接受的对象,它会更容易,因为JSON不能上传文件,但FormData对象可以
+0

*“我不知道原来的对象将如何看起来像(或有多深它会)” * ......听起来像是你需要一个循环和递归。你的问题是什么?你究竟在哪里卡住? –

+0

该代码是插件的一部分,因为其他人将使用它,我不知道人们将如何构建它们的表单。 PHP可以将'field ['name']''转换为'$ data ['field'] ['name']',我想保持这种方式。我知道我需要一个循环,但是如何在不知道对象深度的情况下完成它,并且同时构建字符串 – pocesar

+0

如果将'options'转换为''options [0]“:1',等等? –

回答

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

DEMO

不过,我会推荐使用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); 
    } 
} 

这可能是因为FileFileList)构造函数的名称不同的IE浏览器,但它应该给你一个开始。

+0

完美地工作! – pocesar