以下函数将允许您对一个或多个属性(每个属性的升序(默认)或降序)的对象数组进行排序,并允许您选择是否执行区分大小写的比较。默认情况下,此函数执行不区分大小写的排序。
第一个参数必须是包含对象的数组。后续参数必须是逗号分隔的字符串列表,这些字符串引用要排序的不同对象属性。最后一个参数(可选)是一个布尔值,用于选择是否执行区分大小写的排序- true用于区分大小写的排序。
默认情况下,该函数将按升序对每个属性/键进行排序。如果您希望特定的键以降序排序,请改为以以下格式传递数组:['property_name', true]。
以下是该函数的一些示例用法,并附有说明(其中 homes是包含对象的数组):
objSort(homes, 'city') ->按城市排序(升序,不区分大小写)
objSort(homes, ['city', true]) ->按城市排序(降序,不区分大小写)
objSort(homes, 'city', true)->按城市排序,然后按价格排序(升序,区分大小写)
objSort(homes, 'city', 'price') ->按城市排序,然后按价格排序(都升序,不区分大小写)
objSort(homes, 'city', ['price', true]) ->按城市排序(升序),然后按价格(降序)排序,不区分大小写)
事不宜迟,这里是函数:
function objSort() {
    var args = arguments,
        array = args[0],
        case_sensitive, keys_length, key, desc, a, b, i;
    if (typeof arguments[arguments.length - 1] === 'boolean') {
        case_sensitive = arguments[arguments.length - 1];
        keys_length = arguments.length - 1;
    } else {
        case_sensitive = false;
        keys_length = arguments.length;
    }
    return array.sort(function (obj1, obj2) {
        for (i = 1; i < keys_length; i++) {
            key = args[i];
            if (typeof key !== 'string') {
                desc = key[1];
                key = key[0];
                a = obj1[args[i][0]];
                b = obj2[args[i][0]];
            } else {
                desc = false;
                a = obj1[args[i]];
                b = obj2[args[i]];
            }
            if (case_sensitive === false && typeof a === 'string') {
                a = a.toLowerCase();
                b = b.toLowerCase();
            }
            if (! desc) {
                if (a < b) return -1;
                if (a > b) return 1;
            } else {
                if (a > b) return -1;
                if (a < b) return 1;
            }
        }
        return 0;
    });
} //end of objSort() function
这是一些示例数据:
var homes = [{
    "h_id": "3",
    "city": "Dallas",
    "state": "TX",
    "zip": "75201",
    "price": 162500
}, {
    "h_id": "4",
    "city": "Bevery Hills",
    "state": "CA",
    "zip": "90210",
    "price": 1000000
}, {
    "h_id": "5",
    "city": "new york",
    "state": "NY",
    "zip": "00010",
    "price": 1000000
}, {
    "h_id": "6",
    "city": "Dallas",
    "state": "TX",
    "zip": "85000",
    "price": 300000
}, {
    "h_id": "7",
    "city": "New York",
    "state": "NY",
    "zip": "00020",
    "price": 345000
}];