在对象javascript中更改数组的位置

Joh*_*ohn 0 javascript angularjs lodash

我有一个对象'测试':

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"}
      }
   ]
};
Run Code Online (Sandbox Code Playgroud)

根据'id_above value'(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"}
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我试过了 :

   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
    } }}}   } } }
Run Code Online (Sandbox Code Playgroud)

问题是我的变量o是'undefined',我想在以下之后做:

test.sub=a;         
Run Code Online (Sandbox Code Playgroud)

请问你能帮帮我吗 ?谢谢.

T.J*_*der 7

您不能轻易地将JavaScript对象用作有序容器.相反,使用数组.

虽然现在JavaScript对象属性确实有一个订单(或者某些操作就像对象属性现在有一个订单一样,这取决于你想看它的方式),这是一个新东西(从ES2015开始),而且订单是难以合作.值得注意的是,for-in声明中并没有支持产权制度,也没有Object.keys.一些新操作如Object.getOwnPropertyNames支持新订单.

如果需要订单,请使用数组.