2014-09-25 163 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