Search code examples
javascriptarrayssortingsub-array

Sort array of objects by subarray property value in javascript


I have an array of JavaScript objects:

var people = [
{
    "name": "Edward",
    "age": 100,
    "wallet": {
        "location": "home",
        "cash": 500
    },
    "bank": {
        "location": "bank street",
        "cash": 22100
    }
},
{
    "name": "Lisa",
    "age": 30,
    "wallet": {
        "location": "home",
        "cash": 20
    },
    "bank": {
        "location": "bank street",
        "cash": 12340
    }
},
{
    "name": "Elisabeth",
    "age": 50,
    "wallet": {
        "location": "home",
        "cash": 200
    },
    "bank": {
        "location": "bank street",
        "cash": 5000
    }
}
];

How can I sort them by wallet.cash ?

This following example (by Ege Özcan) works if I wanted to sort these objects by name, or age, but I have hard time modifying it to work with multidimensional key.

function dynamicSort(property) {
var sortOrder = 1;
if(property[0] === "-") {
    sortOrder = -1;
    property = property.substr(1);
}
return function (a,b) {
    var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
    return result * sortOrder;
}
}

This works:

people.sort(dynamicSort("name"));

This doesn't:

people.sort(dynamicSort("wallet.cash"));

Thank you in advance!


Solution

  • You can pass two different arguments to dynamicSort function

    function dynamicSort(property1,property2) {
    var sortOrder = 1;
    if(property1[0] === "-") {
        sortOrder = -1;
        property1 = property1.substr(1);
    }
    return function (a,b) {
        var result = (a[property1][property2] < b[property1][property2]) ? -1 : (a[property1][property2] > b[property1][property2]) ? 1 : 0;
        return result * sortOrder;
    }
    }
    

    And then call

    dynamicSort("wallet","cash");
    

    DEMO

    var people = [
    {
        "name": "Edward",
        "age": 100,
        "wallet": {
            "location": "home",
            "cash": 500
        },
        "bank": {
            "location": "bank street",
            "cash": 22100
        }
    },
    {
        "name": "Lisa",
        "age": 30,
        "wallet": {
            "location": "home",
            "cash": 20
        },
        "bank": {
            "location": "bank street",
            "cash": 12340
        }
    },
    {
        "name": "Elisabeth",
        "age": 50,
        "wallet": {
            "location": "home",
            "cash": 200
        },
        "bank": {
            "location": "bank street",
            "cash": 5000
        }
    }
    ];
    
        function dynamicSort(property1,property2) {
        var sortOrder = 1;
        if(property1[0] === "-") {
            sortOrder = -1;
            property1 = property1.substr(1);
        }
        return function (a,b) {
            var result = (a[property1][property2] < b[property1][property2]) ? -1 : (a[property1][property2] > b[property1][property2]) ? 1 : 0;
            return result * sortOrder;
        }
        }
    
    alert(JSON.stringify(people.sort(dynamicSort("wallet","cash"))))