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

新手上路,请多包涵

从这个 原始问题,我将如何在多个字段上应用排序?

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

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

我喜欢这个事实,而不是给出了一个提供一般方法的 答案。在我计划使用此代码的地方,我将不得不对日期和其他事情进行排序。 “启动”对象的能力似乎很方便,如果不是有点麻烦的话。

我试图将这个 答案 构建成一个很好的通用示例,但我运气不佳。

原文由 Mike 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 888
2 个回答

您可以使用链式排序方法,获取值的增量,直到它达到不等于零的值。

 var data = [{ 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" }];

 data.sort(function (a, b) {
 return a.city.localeCompare(b.city) || b.price - a.price;
 });

 console.log(data);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

或者,使用 es6,简单地:

 data.sort((a, b) => a.city.localeCompare(b.city) || b.price - a.price);

原文由 Nina Scholz 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于您的确切问题的非通用,简单的解决方案:

 homes.sort(
   function(a, b) {
      if (a.city === b.city) {
         // Price is only important when cities are the same
         return b.price - a.price;
      }
      return a.city > b.city ? 1 : -1;
   });

原文由 Snowburnt 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题