通过Javascript在复杂JSON对象上交互的最简单方法
我使用的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]
{
"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;i console.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);
});