2014-09-25 141 views
0

考虑以下几点:如何按关联数组值排序(复杂数组结构)?

,我在一个HTML表格表示数组数据,如:

image of table

1)我怎么会通过b1b3数组排序?

我曾尝试:

var o = { 
 
    "orgs": { 
 
     "655": { 
 
      "data": { 
 
       "cons": 30, 
 
       "b3ports": 0, 
 
       "b9": 2, 
 
       "b1": 25, 
 
       "b2": 14, 
 
       "b3": 10, 
 
       "ports": 0, 
 
       "rica": 30 
 
      }, 
 
      "depth": 1, 
 
      "agents": [207072], 
 
      "orgunit_id": "TEAM00655", 
 
      "name": "TEAM00655: Jabba - Mooi River (Muhammad Jaffar)" 
 
     }, 
 
     "853": { 
 
      "data": { 
 
       "cons": 356, 
 
       "b3ports": 1, 
 
       "b9": 8, 
 
       "b1": 283, 
 
       "b2": 122, 
 
       "b3": 77, 
 
       "ports": 1, 
 
       "rica": 356 
 
      }, 
 
      "depth": 2, 
 
      "agents": [208162], 
 
      "orgunit_id": "TEAM00853", 
 
      "name": "TEAM00853: Jabba - Mooiriver (Bongiwe Gwala)" 
 
     }, 
 
     "921": { 
 
      "data": { 
 
       "cons": 22, 
 
       "b3ports": 0, 
 
       "b9": 2, 
 
       "b1": 20, 
 
       "b2": 7, 
 
       "b3": 5, 
 
       "ports": 0, 
 
       "rica": 22 
 
      }, 
 
      "depth": 1, 
 
      "agents": [210171, 212842], 
 
      "orgunit_id": "TEAM00921", 
 
      "name": "TEAM00921: Jabba - Nolwazi Zungu" 
 
     }, 
 
    }, 
 
    "agents": { 
 
     "207072": { 
 
      "name": "Bongiwe Gwala", 
 
      "oid": 655, 
 
      "depth": 1, 
 
      "aid": "A0207072", 
 
      "orgunit_id": "TEAM00655", 
 
      "data": { 
 
       "cons": 30, 
 
       "b3ports": 0, 
 
       "b9": 2, 
 
       "b1": 25, 
 
       "b2": 14, 
 
       "b3": 10, 
 
       "ports": 0, 
 
       "rica": 30 
 
      }, 
 
      "aname": "A0207072: Bongiwe Gwala", 
 
      "oname": "TEAM00655: Jabba - Mooi River (Muhammad Jaffar)" 
 
     }, 
 
     "208162": { 
 
      "name": "Nkosikhona MADLALA", 
 
      "oid": 853, 
 
      "depth": 2, 
 
      "aid": "A0208162", 
 
      "orgunit_id": "TEAM00853", 
 
      "data": { 
 
       "cons": 356, 
 
       "b3ports": 1, 
 
       "b9": 8, 
 
       "b1": 283, 
 
       "b2": 122, 
 
       "b3": 77, 
 
       "ports": 1, 
 
       "rica": 356 
 
      }, 
 
      "aname": "A0208162: Nkosikhona MADLALA", 
 
      "oname": "TEAM00853: Jabba - Mooiriver (Bongiwe Gwala)" 
 
     }, 
 
     "212842": { 
 
      "name": "SANELE KHUMALO", 
 
      "oid": 921, 
 
      "depth": 1, 
 
      "aid": "A0212842", 
 
      "orgunit_id": "TEAM00921", 
 
      "data": { 
 
       "cons": 22, 
 
       "b3ports": 0, 
 
       "b9": 2, 
 
       "b1": 20, 
 
       "b2": 7, 
 
       "b3": 5, 
 
       "ports": 0, 
 
       "rica": 22 
 
      }, 
 
      "aname": "A0212842: SANELE KHUMALO", 
 
      "oname": "TEAM00921: Jabba - Nolwazi Zungu" 
 
     }, 
 
    }, 
 
"orglist": [853, 655, 921], 
 
} 
 

 
function sort_data(data, sortby, asc) { 
 
    console.log(data); 
 
    if (asc == "asc") { 
 
    data.sort(function(a, b) { 
 
     a.sortby - b.sortby; 
 
    }); 
 
    } else { 
 
    data.sort(function(a, b) { 
 
     a.sortby + b.sortby; 
 
    }); 
 
    } 
 
    // update_data; 
 
} 
 

 
var a = sort_data(o, "b1", "asc"); 
 
console.log(a);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
该怎么过给我一个错误(要查看错误,请打开控制台)


UPDATE:

我得到了排序,以感谢@NicolasAlbert。

现在我需要通过agents以及。它需要通过orgs先订购由agents我曾尝试:

 if (asc == "desc") { 
      data.orglist.sort(function(a, b) { 
       a_org = data.orgs[a].data[sortby]; 
       b_org = data.orgs[b].data[sortby]; 
       a_agent = data.agents[a].data[sortby]; 
       b_agent = data.agents[b].data[sortby]; 
       // return d - c; 
       return b_org - a_org && a_agent - b_agent; 

       // data.agents[a].data[sortby] - data.agents[b].data[sortby] 
      }); 
     } else { 
      data.orglist.sort(function(a, b) { 
       a_org = data.orgs[a].data[sortby]; 
       b_org = data.orgs[b].data[sortby]; 
       a_agent = data.agents[a].data[sortby]; 
       b_agent = data.agents[b].data[sortby]; 
       return a_org - b_org && a_agent - b_agent; 
      }); 
     } 

这不起作用怎么过......

另一个更新

我已经修改我的代码做:

  data.orglist.sort(function(a, b) { 
       a_org = data.orgs[a].data[sortby]; 
       b_org = data.orgs[b].data[sortby]; 
       agents = data.orgs[b].agents.sort(function(a, b){ 
        a_agent = data.agents[a].data[sortby]; 
        b_agent = data.agents[b].data[sortby]; 
        return b_agent - a_agent 
       }); 

       return b_org - a_org && agents; 
      }); 

但是,这两种排序和orgsagents在同一时间。


最后更新:

我得到它的工作,整理两个orgsagents,我不得不创建两个排序功能:

function sort_org(data, sortby, order) { 
     /* 
     Sort the orgs 
     */ 
     var a_org, b_org; 

     if (order == "desc") { 
      data.orglist.sort(function(a, b) { 
       a_org = data.orgs[a].data[sortby]; 
       b_org = data.orgs[b].data[sortby];     
       return b_org - a_org; 
      }); 
     } else { 
      data.orglist.sort(function(a, b) { 
       a_org = data.orgs[a].data[sortby]; 
       b_org = data.orgs[b].data[sortby]; 
       return a_org - b_org; 
      }); 
     } 
    } 

    function sort_agent(data, sortby, order) { 
     /* 
     Sort the agents 
     */ 
     var a_agent, b_agent; 

     if (order == "desc") { 
      for (var orgid in data.orglist){ 
       data.orgs[data.orglist[orgid]].agents.sort(function(a, b){ 
        a_agent = data.agents[a].data[sortby]; 
        b_agent = data.agents[b].data[sortby]; 
        return b_agent - a_agent 
       }) 
      } 
     } else { 
      for (var orgid in data.orglist){ 
       data.orgs[data.orglist[orgid]].agents.sort(function(a, b){ 
        a_agent = data.agents[a].data[sortby]; 
        b_agent = data.agents[b].data[sortby]; 
        return a_agent - b_agent 
       }) 
      } 
     } 
    } 

然后我就打电话功能连续...即

sort_org(o, "b1", "asc"); 
sort_agent(o, "b1", "asc"); 

我希望这可以帮助别人......

回答

1

您只能在Array实例上使用.sort方法,而不是Object。您的数据存储在键/值对象中,并且订单无法修改。

如果您要订购您的数据,您必须在其中引入Array[])。

可能你想订购orglist阵列那样:

var o = { 
 
    "orgs": { 
 
     "655": { 
 
      "data": { 
 
       "cons": 30, 
 
       "b3ports": 0, 
 
       "b9": 2, 
 
       "b1": 25, 
 
       "b2": 14, 
 
       "b3": 10, 
 
       "ports": 0, 
 
       "rica": 30 
 
      }, 
 
      "depth": 1, 
 
      "agents": [207072], 
 
      "orgunit_id": "TEAM00655", 
 
      "name": "TEAM00655: Jabba - Mooi River (Muhammad Jaffar)" 
 
     }, 
 
     "853": { 
 
      "data": { 
 
       "cons": 356, 
 
       "b3ports": 1, 
 
       "b9": 8, 
 
       "b1": 283, 
 
       "b2": 122, 
 
       "b3": 77, 
 
       "ports": 1, 
 
       "rica": 356 
 
      }, 
 
      "depth": 2, 
 
      "agents": [208162], 
 
      "orgunit_id": "TEAM00853", 
 
      "name": "TEAM00853: Jabba - Mooiriver (Bongiwe Gwala)" 
 
     }, 
 
     "921": { 
 
      "data": { 
 
       "cons": 22, 
 
       "b3ports": 0, 
 
       "b9": 2, 
 
       "b1": 20, 
 
       "b2": 7, 
 
       "b3": 5, 
 
       "ports": 0, 
 
       "rica": 22 
 
      }, 
 
      "depth": 1, 
 
      "agents": [210171, 212842], 
 
      "orgunit_id": "TEAM00921", 
 
      "name": "TEAM00921: Jabba - Nolwazi Zungu" 
 
     }, 
 
    }, 
 
    "agents": { 
 
     "207072": { 
 
      "name": "Bongiwe Gwala", 
 
      "oid": 655, 
 
      "depth": 1, 
 
      "aid": "A0207072", 
 
      "orgunit_id": "TEAM00655", 
 
      "data": { 
 
       "cons": 30, 
 
       "b3ports": 0, 
 
       "b9": 2, 
 
       "b1": 25, 
 
       "b2": 14, 
 
       "b3": 10, 
 
       "ports": 0, 
 
       "rica": 30 
 
      }, 
 
      "aname": "A0207072: Bongiwe Gwala", 
 
      "oname": "TEAM00655: Jabba - Mooi River (Muhammad Jaffar)" 
 
     }, 
 
     "208162": { 
 
      "name": "Nkosikhona MADLALA", 
 
      "oid": 853, 
 
      "depth": 2, 
 
      "aid": "A0208162", 
 
      "orgunit_id": "TEAM00853", 
 
      "data": { 
 
       "cons": 356, 
 
       "b3ports": 1, 
 
       "b9": 8, 
 
       "b1": 283, 
 
       "b2": 122, 
 
       "b3": 77, 
 
       "ports": 1, 
 
       "rica": 356 
 
      }, 
 
      "aname": "A0208162: Nkosikhona MADLALA", 
 
      "oname": "TEAM00853: Jabba - Mooiriver (Bongiwe Gwala)" 
 
     }, 
 
     "212842": { 
 
      "name": "SANELE KHUMALO", 
 
      "oid": 921, 
 
      "depth": 1, 
 
      "aid": "A0212842", 
 
      "orgunit_id": "TEAM00921", 
 
      "data": { 
 
       "cons": 22, 
 
       "b3ports": 0, 
 
       "b9": 2, 
 
       "b1": 20, 
 
       "b2": 7, 
 
       "b3": 5, 
 
       "ports": 0, 
 
       "rica": 22 
 
      }, 
 
      "aname": "A0212842: SANELE KHUMALO", 
 
      "oname": "TEAM00921: Jabba - Nolwazi Zungu" 
 
     }, 
 
    }, 
 
"orglist": [853, 655, 921] 
 
} 
 

 
function sort_data(data, sortby, asc) { 
 
    console.log(data); 
 
    
 
    if (asc == "asc") { 
 
    data.orglist.sort(function(a, b) { 
 
     data.orgs[a].data[sortby] - data.orgs[b].data[sortby]; 
 
    }); 
 
    } else { 
 
    data.orglist.sort(function(a, b) { 
 
     data.orgs[b].data[sortby] - data.orgs[a].data[sortby]; 
 
    }); 
 
    } 
 
    // update_data; 
 
} 
 

 
sort_data(o, "b1", "asc"); 
 
console.log(o.orglist);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

谢谢您的回答...我只是reallised,我做了一个错字,当我修改数组:'orgslist','agents'和'orgs'是数组中的键。 我已更新我的代码... – Renier 2014-09-25 08:53:33

+0

呃,实际上,顺序可以修改,但只有浏览器引擎本身,据我所知。换句话说,属性的顺序没有在规范中定义,尽管我发现对象属性通常保持与它们定义的顺序相同 - 尽管这不能保证。 – Agamemnus 2014-09-25 08:56:22

+0

@Renier我用你的新数据格式更新了我的answser。 – 2014-09-25 09:00:05