如何按多个字段对对象数组进行排序?

374

从这个原始问题中,我该如何对多个字段进行排序?

使用这个稍微调整过的结构,我该如何对城市(升序)和价格(降序)进行排序?

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"}
    ];

我喜欢这个答案提供了一个通用的方法。在我计划使用这段代码的地方,我需要对日期以及其他事物进行排序。如果不考虑有些繁琐,预处理对象的能力似乎很方便。

我尝试将这个答案构建成一个好的通用示例,但是我没有太多的成功。


你想搜索还是排序? - Felix Kling
你使用你链接的第二个答案时遇到了什么问题? - canon
它不够通用。我似乎在添加大量代码,而我只想说sort(["first-field", "ASC"], ["second-field", "DSC"]);。当我尝试添加第一个答案的“primer”逻辑以处理日期、大小写不敏感等时,这变得更加复杂。 - Mike
4
如果你愿意使用lodash,可以查看https://lodash.com/docs/4.17.11#orderBy。 - Deepanshu Arora
按属性排序的模式是 homes.sort((a, b) =>),其中 a.propb.propa.prop - b.prop 数值排序,a.prop.localeCompare(b.prop) 字典序排序,(b.prop < a.prop) - (a.prop < b.prop) 通用排序。要按降序排序而不是升序,请取反返回值(例如,使用 b.prop - a.prop 而不是 a.prop - b.prop)。 - Sebastian Simon
42个回答

-2
homes.sort(function(a,b) { return a.city - b.city } );
homes.sort(function(a,b){
    if (a.city==b.city){
        return parseFloat(b.price) - parseFloat(a.price);
    } else {
        return 0;
    }
});

为什么不把所有东西都放在一个函数里?如果城市不相等,则返回它们的差异,否则,计算价格的差异。 - Mad Physicist

-6

按多个字段对对象数组进行排序的最简单方法:

 let 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((a, b) => (a.city > b.city) ? 1 : -1);

输出: "贝弗利山庄" "达拉斯" "达拉斯" "达拉斯" "纽约"


5
OP正在询问如何按多个属性进行排序,而您在此仅使用了一个字段。在回答之前请仔细阅读问题。 - kabirbaidhya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接