1

我有一个深度最多为 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]={...}

这将具有与 in 相同的值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)。

请忽略任何错别字,我刚刚重新创建了逻辑。

4

2 回答 2

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"
        }
    }
}
于 2012-05-27T20:05:08.170 回答
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 专家。我知道在迭代对象中hasOwnProperty可以解决的属性时有时会出现问题,这些问题可能会在这样的示例中蔓延。不过,我不知道这些问题是什么。例如,我用一个简单的 JSON 对象尝试了这段代码,它工作了:)

http://jsfiddle.net/e9uST/ - 使用浏览器中的 Javascript 控制台查看输出。

于 2012-05-27T20:05:58.147 回答