我的对象深度最多为3:
OBJ.T.V.E={...}
T和V是整数(如OBJ [0] [1] ['String'] = {...}) 所以典型的结构可能是:
OBJ[0][0]['S1']={..}
OBJ[0][0]['S2']={..}
OBJ[0][1]['S1']={..}
OBJ[0][2]['S1']={..}
我想重新安排并以某种方式得到这个:
OBJNEW['S1'][0][0]={...}
与OBJ[0][0]['S1']
我在没有运气的情况下挣扎了好几个小时。有任何想法吗? Jquery代码也很受欢迎。
修改: 现在我尝试创建一个像这样的对象数组:
OBJ2=[];
$.each(OBJ, function(name, value) {
$(value).each(OBJ, function(name1, value1) {
OBJ2[name1]=[];
$(value1).each(OBJ, function(name2, value2) {
OBJ2[name1][name2]={};
OBJ2[name1][name2]['S1']={};
})
})
但是这一步失败了,因为每个...... ['S1']赋值都会覆盖前一个对象(例如S2)。
请忽略任何拼写错误,我刚重新创建逻辑。
答案 0 :(得分:3)
这应该让你相当远,除非我误解。
function flipObject(o) {
var i1, i2, i3, result = {};
for ( i1 in o ) {
if ( o.hasOwnProperty(i1) ) {
for ( i2 in o[i1] ) {
if ( o[i1].hasOwnProperty(i2) ) {
for ( i3 in o[i1][i2] ) {
if ( o[i1][i2].hasOwnProperty(i3) ) {
if ( !(i3 in result) ) result[i3] = {};
if ( !(i1 in result[i3]) ) result[i3][i1] = {};
result[i3][i1][i2] = o[i1][i2][i3];
}
}
}
}
}
}
return result;
}
转为
{
"0": {
"0": {
"s1": "s1.0.0",
"s2": "s2.0.0"
},
"1": {
"s1": "s1.0.1",
"s2": "s2.0.1"
}
},
"1": {
"0": {
"s1": "s1.1.0",
"s2": "s2.1.0"
},
"1": {
"s1": "s1.1.1",
"s2": "s2.1.1"
}
}
}
到
{
"s1": {
"0": {
"0": "s1.0.0",
"1": "s1.0.1"
},
"1": {
"0": "s1.1.0",
"1": "s1.1.1"
}
},
"s2": {
"0": {
"0": "s2.0.0",
"1": "s2.0.1"
},
"1": {
"0": "s2.1.0",
"1": "s2.1.1"
}
}
}
答案 1 :(得分:1)
原始代码中的一些问题是您不能将普通数组[]
用作关联数组{}
。字符串键只能在关联数组中使用。接下来的问题是你可以而且应该迭代所有的字符串键,而不是试图对它们进行硬编码。
您可以做的最简单的事情是为原始对象的层次结构的每个级别编写for
/ in
循环,然后在将它们写入新对象时翻转赋值。您还必须检查父键是否存在,如果不存在,则创建它们。
var NEWOBJ = {};
for (var outerKey in OBJ) {
for (var innerKey in OBJ[outerKey]) {
for (var stringKey in OBJ[outerKey][innerKey]) {
NEWOBJ[stringKey] = NEWOBJ[stringKey] || {};
NEWOBJ[stringKey][outerKey] = NEWOBJ[stringKey][outerKey] || {};
NEWOBJ[stringKey][outerKey][innerKey] = OBJ[outerKey][innerKey][stringKey];
}
}
}
console.log(NEWOBJ);
据我所知,jQuery在这方面没什么可帮助的。它实际上并不比完成同样的本机Javascript简单。
请注意,这不会对您正在移动的对象执行深层复制。我相信如果您更改NEWOBJ
中的对象,它们也会在OBJ
中更改。我认为通常很难解决这个问题,你可能不得不求助于每种对象类型的自定义复制对象。
另请注意,我不是Javascript GURU。我知道,当迭代hasOwnProperty
可以解决的对象中的属性时,有时会遇到问题。不过,我不知道这些问题是什么。例如,我使用一个简单的JSON对象尝试了这个代码,它起作用了:)
http://jsfiddle.net/e9uST/ - 使用浏览器中的Javascript控制台查看输出。