0

Consider the Following:

I am representing data in an array in an HTML table such as:

image of table

1) How would I sort the array by b1 or b3?

I have tried:

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>
This how ever gives me an error( To view the error, open your console )


UPDATE:

I got the sorting to work thanks to @NicolasAlbert.

Now I need to order by the agents aswell. It needs to order by orgs first and then by agents I have tried:

        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;
            });
        }

This does not work how ever...

Another update

I have modified my code to do:

            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;
            });

But this sorts both orgs and agents at the same time.


LAst update:

I got it to work, sorting both the orgs and the agents, I had to create two sorting functions:

    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
                })
            }
        }
    }

then I just call the functions consecutively... i.e.

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

I hope this can help someone...

1 Answer 1

1

You can only use .sort method on Array instance, not Object. Your data is store in key/value objects and the order cannot be modified.

If you want order your data, you must introduce Array ([]) in it.

May you want order the orglist array like that:

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>

Sign up to request clarification or add additional context in comments.

7 Comments

Thanks for your answer... I just reallised that I made a typo when I modified the array: orgslist, agents and orgs are keys in the array. I have updated my code...
Well, actually, the order can be modified, but only by the browser engine itself, as far as I know. In other words, the order of properties is not defined in the spec, though I have found that object properties generally stay in the same order they were defined at -- though that isn't guaranteed.
@NicolasAlbert thanks, this works great.. You have to return data.orgs[b].data[sortby] - data.orgs[a].data[sortby]; tho.... as a on the side question, if I may, how would I sort using the agents and the orgs? Ill update my question..
(I write from mobile) "a - b" return a numeric value and you use "&&" that work for boolean value. I don't know how you want to mix the sort between "orgs" and "agents".
I want to sort by orgs first and then agents... Thanks for your help btw.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.