0

My $http response gives me the results in the below format:

$scope.rooms = {  
    '2B' : [    
        {"RoomEmailId":"2B-323@me.com","RoomName":"2B-323"},    
        {"RoomEmailId":"2B-123@me.com","RoomName":"2B-123"}     
    ],   
    '5A' : [  
        {"RoomEmailId":"5A-323@me.com","RoomName":"5A-323"},   
        {"RoomEmailId":"5A-123@me.com","RoomName":"5A-123"},  
        {"RoomEmailId":"5A-423@me.com","RoomName":"5A-423"}  
    ],  
    '1A' : [  
        {"RoomEmailId":"1A-323@me.com","RoomName":"1A-323"},  
        {"RoomEmailId":"1A-123@me.com","RoomName":"1A-123"},  
        {"RoomEmailId":"1A-423@me.com","RoomName":"1A-423"}  
    ]  
}

I want to sort this result in the below order:

$scope.rooms = {  
    '1A' : [  
        {"RoomEmailId":"1A-123@me.com","RoomName":"1A-123"},  
        {"RoomEmailId":"1A-323@me.com","RoomName":"1A-323"},  
        {"RoomEmailId":"1A-423@me.com","RoomName":"1A-423"}  
    ]  
    '2B' : [  
        {"RoomEmailId":"2B-123@me.com","RoomName":"2B-123"},  
        {"RoomEmailId":"2B-323@me.com","RoomName":"2B-323"}       
    ],  
    '5A' : [  
        {"RoomEmailId":"5A-123@me.com","RoomName":"5A-123"},  
        {"RoomEmailId":"5A-323@me.com","RoomName":"5A-323"},        
        {"RoomEmailId":"5A-423@me.com","RoomName":"5A-423"}              
    ],  
}

How to sort it by using javascript?

  • 1
    Your current data is an object, not an array. If you want it to be sorted you need to use an array. (Or process in `Object.keys($scope.rooms).sort()` order.) The nested arrays can be sorted using `.sort()` with an appropriate comparator. By the way, there is no JSON in your question, only objects and arrays. – nnnnnn Mar 19 '17 at 04:40

2 Answers2

0

what you want is like this?delete and reassign value to the object instead.usage:sort(rooms,by("RoomName","RoomEmailId"))

Code

function by(columns) {
    columns = typeof columns == "string" ? columns.split(",") : columns;

    function compare(a, b) {
        return a > b ? 1 : a < b ? -1 : 0;
    }

    return function (a, b) {
        for (var i in columns) {
            var p = columns[i];
            var it = compare(a[p], b[p]);
            if (it) {
                return it;
            }
        }
        return 0;
    }
}

function sort(o, comparator) {
    return Object.keys(o).sort().reduce(function (o, key) {
        var it = o[key];
        delete o[key];
        o[key] = it.sort ? it.sort(comparator) : it;
        return o;
    }, o);
}

Test

test("sort keys", () => {
    let o = {b: 2, a: 1};

    expect(Object.keys(o)).toEqual(["b", "a"]);
    expect(sort(o, null)).toEqual({a: 1, b: 2});
    expect(Object.keys(o)).toEqual(["a", "b"]);
});

test("sort values", () => {
    let o = {b: [{value: 2}, {value: 1}], a: [{value: 4}, {value: 3}]};

    expect(Object.keys(o)).toEqual(["b", "a"]);
    expect(sort(o, by("value"))).toEqual({b: [{value: 1}, {value: 2}], a: [{value: 3}, {value: 4}]});
    expect(Object.keys(o)).toEqual(["a", "b"]);
});

Demo

var rooms = {  
    '2B' : [    
        {"RoomEmailId":"2B-323@me.com","RoomName":"2B-323"},    
        {"RoomEmailId":"2B-123@me.com","RoomName":"2B-123"}     
    ],   
    '5A' : [  
        {"RoomEmailId":"5A-323@me.com","RoomName":"5A-323"},   
        {"RoomEmailId":"5A-123@me.com","RoomName":"5A-123"},  
        {"RoomEmailId":"5A-423@me.com","RoomName":"5A-423"}  
    ],  
    '1A' : [  
        {"RoomEmailId":"1A-323@me.com","RoomName":"1A-323"},  
        {"RoomEmailId":"1A-123@me.com","RoomName":"1A-123"},  
        {"RoomEmailId":"1A-423@me.com","RoomName":"1A-423"}  
    ]  
};
function by(columns) {
    columns = typeof columns == "string" ? columns.split(",") : columns;

    function compare(a, b) {
        return a > b ? 1 : a < b ? -1 : 0;
    }

    return function (a, b) {
        for (var i in columns) {
            var p = columns[i];
            var it = compare(a[p], b[p]);
            if (it) {
                return it;
            }
        }
        return 0;
    }
}

function sort(o, comparator) {
    return Object.keys(o).sort().reduce(function (o, key) {
        var it = o[key];
        delete o[key];
        o[key] = it.sort ? it.sort(comparator) : it;
        return o;
    }, o);
}
console.log("unsorted rooms:",rooms);
console.log("sorted rooms:",sort(rooms,by("RoomName","RoomEmailId")));
holi-java
  • 29,655
  • 7
  • 72
  • 83
  • This only works by accident. This behavior is not guaranteed by the JS script. –  Mar 19 '17 at 05:26
0

I can see you've moved the keys around within the object. Object key-values are not sort-able, you'll need them to be in an array for that to happen. If you just wish to sort the arrays that are the values of those keys then you can reduce the Objects keys and return a new object as you require (this solution is nice since you won't be mutating your original rooms object)

const result = Object.keys(rooms).reduce((obj, roomKey) => {
  obj[roomKey] = rooms[roomKey].slice().sort((a, b) => a.RoomName > b.RoomName);
  return obj;
}, {});

Here it is in action: http://jsbin.com/paqavaxako/edit?html,js,console

horyd
  • 1,364
  • 10
  • 12