重新排列javascript对象

时间:2012-05-27 19:39:26

标签: javascript

我的对象深度最多为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)。

请忽略任何拼写错误,我刚重新创建逻辑。

2 个答案:

答案 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控制台查看输出。