通过Javascript对复杂JSON对象进行交互的最简单方法

我正在使用具有一些奇怪结构的JSON数据,例如:

{ "RESULT": { "COLUMNS": ["ID","name","ENABLED","perms","vcenabled","vcvalue","checkenabled","checkvalue","indxenabled","indxvalue"], "DATA": [ [7,"Site-A", 1, "1,2", 1, 1, 1, 0, 0, 0], [15,"Site-B", 1, "1,2,3,4", 1, 1, 1, 0, 0, 0] ] }, "ERROR": 0 } 

我想创建一些JavaScript,将这些数据重组为正确的JSON结构,以便“Column”数组值成为“DATA”数组值的键。 因此,在运行JS进程后,数据类似于以下内容:

 [ {"ID":7,"name":"Site-A","ENABLED":1,"perms":"1,2","vcenabled":1,"vcvalue":1,"checkenabled":1,"checkvalue":1,"indxenabled":1,"indxvalue":1}, {"ID":15,"name":"Site-B","ENABLED":1,"perms":"1,2","vcenabled":1,"vcvalue":1,"checkenabled":1,"checkvalue":1,"indxenabled":1,"indxvalue":1} ] 

完成JSON重组的JavaScript最佳实践是什么? 我可以使用JS框架(如JQuery,Foundation JS等)完成此任务吗?

newjson是你的新对象,j是你的json,

代码非常快,因为它缓存了legth并且不使用push。

因为它是纯粹的JavaScript,它比所有库都要快。

 var j={ "RESULT":{ "COLUMNS":[ "ID", "name", "ENABLED", "perms", "vcenabled", "vcvalue", "checkenabled", "checkvalue", "indxenabled", "indxvalue" ], "DATA":[ [7,"Site-A", 1, "1,2", 1, 1, 1, 0, 0, 0], [15,"Site-B", 1, "1,2,3,4", 1, 1, 1, 0, 0, 0] ] }, "ERROR": 0 } var newjson=[],d=j.RESULT.COLUMNS.length; for(var a=0,b=j.RESULT.DATA.length;a 

根据Bergi的反应你也可以使用while循环。

 var orig={ "RESULT":{ "COLUMNS":[ "ID", "name", "ENABLED", "perms", "vcenabled", "vcvalue", "checkenabled", "checkvalue", "indxenabled", "indxvalue" ], "DATA":[ [7,"Site-A", 1, "1,2", 1, 1, 1, 0, 0, 0], [15,"Site-B", 1, "1,2,3,4", 1, 1, 1, 0, 0, 0] ] }, "ERROR": 0 } var formatted = [], data = orig.RESULT.DATA, cols = orig.RESULT.COLUMNS, l = cols.length, f = data.length; while (f--) { var d = data[f], o = {}, g = l; while (g--) { o[cols[g]] = d[g]; } formatted[f] = o; } 

使用Underscore ,它是一个单行:

 var formatted = _.map(orig.RESULT.DATA, _.partial(_.object, orig.RESULT.COLUMNS)); 

使用普通的javascript(不那么优雅但更快),它会

 var formatted = [], data = orig.RESULT.DATA, cols = orig.RESULT.COLUMNS, l = cols.length; for (var i=0; i 

您可以使用下划线数组函数执行此任务

http://underscorejs.org/#arrays

使用对象function会有所帮助http://underscorejs.org/#object

来自文档:_.object(list,[values])将数组转换为对象。 传递一个[key,value]对列表,或一个键列表,以及一个值列表..示例:

 _.object(['moe', 'larry', 'curly'], [30, 40, 50]); => {moe: 30, larry: 40, curly: 50} 

这里是JSfiddle的解决方案http://jsfiddle.net/rayweb_on/kxR88/1/

对于这个特定的场景,代码看起来像这样。

  var plain = { "RESULT": { "COLUMNS": ["ID","name","ENABLED","perms","vcenabled","vcvalue","checkenabled","checkvalue","indxenabled","indxvalue"], "DATA": [ [7,"Site-A", 1, "1,2", 1, 1, 1, 0, 0, 0], [15,"Site-B", 1, "1,2,3,4", 1, 1, 1, 0, 0, 0] ] }, "ERROR": 0 }, formatted = []; _.each(plain.RESULT.DATA, function(value) { var tmp = {}; tmp = _.object(plain.RESULT.COLUMNS,value) formatted.push(tmp); }); console.log(formatted); 

尝试使用underscorejs。

 var plain = { "RESULT": { "COLUMNS": ["ID","name","ENABLED","perms","vcenabled","vcvalue","checkenabled","checkvalue","indxenabled","indxvalue"], "DATA": [ [7,"Site-A", 1, "1,2", 1, 1, 1, 0, 0, 0], [15,"Site-B", 1, "1,2,3,4", 1, 1, 1, 0, 0, 0] ] }, "ERROR": 0 } , formatted = []; _.each(plain.RESULT.DATA, function(value) { var tmp = {}; _.each(value, function(parameter, pos) { tmp[plain.RESULT.COLUMNS[pos]] = parameter; }); formatted.push(tmp); }); console.log(formatted); 

http://jsfiddle.net/kxR88/

实际上,您可以将Array#map用于数组,使用Array#reduce用于具有新属性的对象

 var data = { RESULT: { COLUMNS: ["ID", "name", "ENABLED", "perms", "vcenabled", "vcvalue", "checkenabled", "checkvalue", "indxenabled", "indxvalue"], DATA: [[7, "Site-A", 1, "1,2", 1, 1, 1, 0, 0, 0], [15, "Site-B", 1, "1,2,3,4", 1, 1, 1, 0, 0, 0]] }, ERROR: 0 }, result = data.RESULT.DATA.map(function (a) { return a.reduce(function (o, d, i) { o[data.RESULT.COLUMNS[i]] = d; return o; }, {}); }); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; }