2016-12-28 51 views
0

我有一个对象“测试”:改变位置的JavaScript

var test={ 
    "unit3":[ 
     { 
     "chapter":{ 
      "id":4, 
      "name":"earth", 
      "id_above":2 
     } 
     }, 
     { 
     "book":{"name":"earth"} 
     } 
    ], 
    "unit4":[ 
     { 
     "chapter":{ 
      "id":5, 
      "name":"water", 
      "id_above":2 
     } 
     }, 
     { 
     "book":{"name":"sea"} 
     } 
    ], 
    "unit1":[ 
     { 
     "chapter":{ 
      "id":2, 
      "name":"biology", 
      "id_above":2 
     } 
     }, 
     { 
     "book":{"name":"science"} 
     } 
    ] 
}; 

据“id_above值”(id_above和id应该是相同的,如果没有,我必须移动它下右单元),我希望得到这样的:

var hope={ 
    "unit1":[ 
    { 
     "chapter":{ 
     "id":2, 
     "name":"biology", 
     "id_above":2 
     } 
    }, 
    { 
     "book":{"name":"science"} 
    } 
    ], 
    "sub":[ 
    { 
     "unit3":[ 
     { 
      "chapter":{ 
      "id":4, 
      "name":"earth", 
      "id_above":2 
      } 
     }, 
     { 
      "book":{"name":"earth"} 
     } 
     ], 
     "unit4":[ 
     { 
      "chapter":{ 
      "id":5, 
      "name":"water", 
      "id_above":2 
      } 
     }, 
     { 
      "book":{"name":"sea"} 
     } 
     ] 
    } 
    ] 
} 

我想:

for (var key in test){ 
    if(test.hasOwnProperty(key)){ 
    for (var i =0;i<test[key].length;i++){ 
    if (test[key][i].chapter.id!=test[key][i].chapter.id_above){ 


    for (var key2 in test){ 
    if(test.hasOwnProperty(key2)){ 
    for (var j =0;j<test[key2].length;j++){ 
    var o=_.find(test[key2][j].chapter,{id:test[key][i].chapter.id_above}) 
    console.log("o",o); //undefined 
    } }}} } } } 

的问题是,我的变量o是 '未定义',我想要做的事情之后像这样:

test.sub=a;   

你能帮我吗?谢谢。

回答

7

不能容易地使用JavaScript对象订购容器。相反,使用数组。

尽管JavaScript对象属性现在有一个订单(或者某些操作就像对象属性现在有订单一样,具体取决于您想如何查看它),但这是一件新事物(截至ES2015)而且这个命令很难合作。值得注意的是,for-in声明支持属性订单而不是Object.keys也不支持。一些新的操作如Object.getOwnPropertyNames确实支持新订单。

当您需要订单时,请使用数组。

+0

对不起,英语不是我的母语。如果我明白了,你告诉我将'test'转换为数组? – John

+0

@John:是的,确切的。 –