我使用AJAX获取了以下对象,并将它们存储在数组中:

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": "5",
        "city": "New York",
        "state": "NY",
        "zip": "00010",
        "price": "962500"
    }
];

如何创建一个函数,仅使用JavaScript按price属性按升序或降序对对象进行排序?


当前回答

使用此函数

const r_sort = (a, b, field, asc) => {
    let reverse = asc ? 1 : -1;
    if (a[field] > b[field]) {
        return 1 * reverse;
    }
    else if (b[field] > a[field]) {
        return -1 * reverse;
    }
    else {
        return 0;
    } }

//用法:

homes = homes.sort((a,b) => r_sort(a,b,price,true)) // true for ascending and false for descending

其他回答

有了ECMAScript 6,StoBor的答案可以更加简洁:

homes.sort((a, b) => a.price - b.price)

对于多数组对象字段的排序。在arrprop数组中输入域名,如[“a”,“b”,“c”]然后传入我们要排序的第二个参数arrsource实际源。

function SortArrayobject(arrprop,arrsource){
arrprop.forEach(function(i){
arrsource.sort(function(a,b){
return ((a[i] < b[i]) ? -1 : ((a[i] > b[i]) ? 1 : 0));
});
});
return arrsource;
}

虽然我知道OP想要对一组数字进行排序,但这个问题已经被标记为字符串相关类似问题的答案。事实上,上面的答案没有考虑对大小写很重要的文本数组进行排序。大多数答案采用字符串值并将其转换为大写/小写,然后以某种方式进行排序。我遵守的要求很简单:

按字母顺序A-Z排序同一单词的大写值应在小写值之前应将相同字母(A/A、B/B)的值分组在一起

我期望的是[A,A,B,B,C,C],但上面的答案返回A,B,C,A,B,C。实际上,我在这个问题上花了比我想要的时间更长的时间(这就是为什么我发布这个消息,希望它能帮助至少一个人)。虽然两个用户在注释中提到了localeCompare函数,但直到我在四处搜索时偶然发现了该函数之后,我才发现这一点。在阅读了String.product.localeCompare()文档后,我想到了这个:

var values = [ "Delta", "charlie", "delta", "Charlie", "Bravo", "alpha", "Alpha", "bravo" ];
var sorted = values.sort((a, b) => a.localeCompare(b, undefined, { caseFirst: "upper" }));
// Result: [ "Alpha", "alpha", "Bravo", "bravo", "Charlie", "charlie", "Delta", "delta" ]

这告诉函数在小写值之前对大写值进行排序。localeCompare函数中的第二个参数是定义语言环境,但如果您将其保留为未定义,它会自动为您计算语言环境。

这同样适用于对对象数组进行排序:

var values = [
    { id: 6, title: "Delta" },
    { id: 2, title: "charlie" },
    { id: 3, title: "delta" },
    { id: 1, title: "Charlie" },
    { id: 8, title: "Bravo" },
    { id: 5, title: "alpha" },
    { id: 4, title: "Alpha" },
    { id: 7, title: "bravo" }
];
var sorted = values
    .sort((a, b) => a.title.localeCompare(b.title, undefined, { caseFirst: "upper" }));

这是一个更灵活的版本,允许您创建可重用的排序函数,并按任何字段排序。

const sort_by=(字段,反转,引物)=>{常量键=引物?函数(x){返回底漆(x[字段])} :函数(x){返回x[字段]};反转=!颠倒1 : -1;返回函数(a,b){返回a=键(a),b=键(b),反转*((a>b)-(b>a));}}//现在您可以随意按任何字段排序。。。const homes=[{h_id:“3”,城市:“达拉斯”,州:“TX”,邮编:“75201”,价格:“162500”},{h_id:“4”,城市“贝弗利山”,州“CA”,邮编“90210”,价格“319250”},{h_id:”5“,城市:”纽约“,州:”NY“,邮编:”00010“,价格:”962500“}];//按价格从高到低排序console.log(homes.sort(sort_by('price',true,parseInt)));//按城市排序,不区分大小写,A-Zconsole.log(homes.sort(sort_by('city',false,(a)=>a.toUpperCase())));

如果使用Undercore.js,请尝试sortBy:

// price is of an integer type
_.sortBy(homes, "price"); 

// price is of a string type
_.sortBy(homes, function(home) {return parseInt(home.price);});