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

通过Javascript在复杂JSON对象上交互的最简单方法,javascript,jquery,json,javascript-framework,Javascript,Jquery,Json,Javascript Framework,我使用的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]

我使用的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结构,以便“列”数组值成为“数据”数组值的键。因此,在运行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最佳实践是什么?我能使用JQuery框架,如jQuery、Fuffer-JS、ECT…?p> 此任务可以使用下划线数组函数

使用对象函数会很有帮助

从文件中: _.object(列表,[值]) 将数组转换为对象。传递[key,value]对的单个列表,或键列表和值列表。示例:

_.object(['moe', 'larry', 'curly'], [30, 40, 50]);
 => {moe: 30, larry: 40, curly: 50}
下面是解决方案的JSFIDLE

对于这个特定的场景,代码是这样的

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

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<b;a++){
 for(var c=0,tmpObj={};c<d;c++){
  tmpObj[j.RESULT.COLUMNS[c]]=j.RESULT.DATA[a][c];
 }
 newjson[a]=tmpObj;
}

console.log(newjson);

尝试使用下划线

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

使用,它是一个单行程序:

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<data.length; i++) {
    var d = data[i],
        o = {};
    for (var j=0; j<l; j++)
        o[cols[j]] = d[j];
    formatted.push(o);
}
var格式=[],
数据=原始结果数据,
cols=原始结果列,
l=cols.长度;

对于(var i=0;i实际上,可以对数组和具有新属性的对象使用

var data={RESULT:{列:[ID”,“name”,“ENABLED”,“perms”,“vcenabled”,“vcvalue”,“checkenabled”,“checkvalue”,“indxenabled”,“indxvalue”],数据:[[7,“Site-A”,1,“1,2”,1,1,1,1,0,0],[15,“Site-B”,1,“1,2,3,4”,1,1,1,1,1,0]},错误:0},
结果=data.result.data.map(函数(a){
返回a.reduce(函数(o,d,i){
o[data.RESULT.COLUMNS[i]]=d;
返回o;
}, {});
});
console.log(结果);
.as控制台包装{max height:100%!重要;top:0;}
使用JQuery:

function jsonToObj(json){
   return jQuery.parseJSON(JSON.stringify(json));
}
例如,在GET请求之后,服务器发送一个复杂的对象

  $.get("/Files/-2", function (rxData, status) {

      var obj = jsonToObj(rxData);
      console.log(obj);
  });
登录控制台,可以通过Chrome的Web Developer(F12)进行探索,在我的例子中,如下所示:


通过simple JS,您的解决方案如下所示:

var yourObj={
“结果”:{
“列”:[“ID”、“name”、“ENABLED”、“perms”、“vcenabled”、“vcvalue”、“checkenabled”、“checkvalue”、“indxenabled”、“indxvalue”],
“数据”:[
[7,“站点A”,1,“1,2”,1,1,1,0,0,0],
[15,“站点B”,1,“1,2,3,4”,1,1,1,0,0]
]
},
“错误”:0
}
//解决方案
var finalARR=[];
var colLength=yourObj.RESULT.COLUMNS.length;
var dataLength=yourObj.RESULT.DATA.length;
对于(变量i=0;iconsole.log(finalARR);
你可以通过一个简单的循环来完成。创建一个空对象,遍历
列,从
数据中获取数据,然后填充你的新对象。@Clautrofob:为了简单起见,请使用两个循环:-)为什么你认为不使用push会更好?顺便说一句,代码非常慢,因为它没有缓存相关的东西;比newjson.push(tmpObj)快。你想缓存什么?好的,如果你已经有
索引,那会更好,但是
arr.push(x)
arr[arr.length]=x
之间没有相关的区别。有关详细分析,请参阅-应该使用更清晰的内容:-)是的,这取决于浏览器,无论如何,缓存的使用效果很好=)我现在添加了一段时间--loop;)为什么使用慢速
每个
函数而不是for循环?下划线的方法看起来不同。叶,你的下划线一行看起来更好。很好的一个带有
的部分,从未使用过这个。好吧,你真的应该使用适当的:-)
  $.get("/Files/-2", function (rxData, status) {

      var obj = jsonToObj(rxData);
      console.log(obj);
  });