How to sort an array of objects by multiple fields?

后端 未结 30 2335
北恋
北恋 2020-11-21 11:34

From this original question, how would I apply a sort on multiple fields?

Using this slightly adapted structure, how would I sort city (ascending) & then price (

30条回答
  •  长情又很酷
    2020-11-21 12:28

    Here is a simple functional approach. Specify sort order using array. Prepend minus to specify descending order.

    var homes = [
        {"h_id":"3", "city":"Dallas", "state":"TX","zip":"75201","price":"162500"},
        {"h_id":"4","city":"Bevery Hills", "state":"CA", "zip":"90210", "price":"319250"},
        {"h_id":"6", "city":"Dallas", "state":"TX", "zip":"75000", "price":"556699"},
        {"h_id":"5", "city":"New York", "state":"NY", "zip":"00010", "price":"962500"}
        ];
    
    homes.sort(fieldSorter(['city', '-price']));
    // homes.sort(fieldSorter(['zip', '-state', 'price'])); // alternative
    
    function fieldSorter(fields) {
        return function (a, b) {
            return fields
                .map(function (o) {
                    var dir = 1;
                    if (o[0] === '-') {
                       dir = -1;
                       o=o.substring(1);
                    }
                    if (a[o] > b[o]) return dir;
                    if (a[o] < b[o]) return -(dir);
                    return 0;
                })
                .reduce(function firstNonZeroValue (p,n) {
                    return p ? p : n;
                }, 0);
        };
    }
    

    Edit: in ES6 it's even shorter!

    "use strict";
    const fieldSorter = (fields) => (a, b) => fields.map(o => {
        let dir = 1;
        if (o[0] === '-') { dir = -1; o=o.substring(1); }
        return a[o] > b[o] ? dir : a[o] < b[o] ? -(dir) : 0;
    }).reduce((p, n) => p ? p : n, 0);
    
    const homes = [{"h_id":"3", "city":"Dallas", "state":"TX","zip":"75201","price":162500},     {"h_id":"4","city":"Bevery Hills", "state":"CA", "zip":"90210", "price":319250},{"h_id":"6", "city":"Dallas", "state":"TX", "zip":"75000", "price":556699},{"h_id":"5", "city":"New York", "state":"NY", "zip":"00010", "price":962500}];
    const sortedHomes = homes.sort(fieldSorter(['state', '-price']));
    
    document.write('
    ' + JSON.stringify(sortedHomes, null, '\t') + '
    ')

提交回复
热议问题