【问题标题】:Sort Array of object by object field in Angular 6 [duplicate]在Angular 6中按对象字段对对象数组进行排序[重复]
【发布时间】:2018-12-14 03:27:21
【问题描述】:

我从一个从 json 端点获取数据的解析器获取了一组“产品”。

ngOnInit() {
  this.products = this._route.snapshot.data.products;
  console.log('products: ', this.products);
}

这个数组中的一个对象的格式是什么

 {
    "id": 3645,
    "date": "2018-07-05T13:13:37",
    "date_gmt": "2018-07-05T13:13:37",
    "guid": {
        "rendered": ""
    },
    "modified": "2018-07-05T13:13:37",
    "modified_gmt": "2018-07-05T13:13:37",
    "slug": "vpwin",
    "status": "publish",
    "type": "matrix",
    "link": "",
    "title": {
        "rendered": "VPWIN"
    },
    "content": {
        "rendered": "",
        "protected": false
    },
    "featured_media": 0,
    "parent": 0,
    "template": "",
    "better_featured_image": null,
    "acf": {
        "domain": "SMB",
        "ds_rating": "3",
        "dt_rating": ""
    },
    ...
},

我想做的是按字段title.rendered对这个数组进行排序

在过去,在 AngularJS 中,我会简单地在设置为该字段的模板中使用 orderBy 管道。显然,这在 Angular 中已被删除,并且从研究来看,似乎首选的方法是对数据本身进行排序,例如在 ngOnInit 中。

但我不知道如何按producs.title.renderedproducts 进行排序。

【问题讨论】:

标签: javascript arrays angular typescript sorting


【解决方案1】:

您可以简单地使用Arrays.sort()

array.sort((a,b) => a.title.rendered.localeCompare(b.title.rendered));

工作示例:

var array = [{"id":3645,"date":"2018-07-05T13:13:37","date_gmt":"2018-07-05T13:13:37","guid":{"rendered":""},"modified":"2018-07-05T13:13:37","modified_gmt":"2018-07-05T13:13:37","slug":"vpwin","status":"publish","type":"matrix","link":"","title":{"rendered":"VPWIN"},"content":{"rendered":"","protected":false},"featured_media":0,"parent":0,"template":"","better_featured_image":null,"acf":{"domain":"SMB","ds_rating":"3","dt_rating":""},},{"id":3645,"date":"2018-07-05T13:13:37","date_gmt":"2018-07-05T13:13:37","guid":{"rendered":""},"modified":"2018-07-05T13:13:37","modified_gmt":"2018-07-05T13:13:37","slug":"vpwin","status":"publish","type":"matrix","link":"","title":{"rendered":"adfPWIN"},"content":{"rendered":"","protected":false},"featured_media":0,"parent":0,"template":"","better_featured_image":null,"acf":{"domain":"SMB","ds_rating":"3","dt_rating":""}},{"id":3645,"date":"2018-07-05T13:13:37","date_gmt":"2018-07-05T13:13:37","guid":{"rendered":""},"modified":"2018-07-05T13:13:37","modified_gmt":"2018-07-05T13:13:37","slug":"vpwin","status":"publish","type":"matrix","link":"","title":{"rendered":"bbfPWIN"},"content":{"rendered":"","protected":false},"featured_media":0,"parent":0,"template":"","better_featured_image":null,"acf":{"domain":"SMB","ds_rating":"3","dt_rating":""}}];
array.sort((a,b) => a.title.rendered.localeCompare(b.title.rendered));
 
 console.log(array);

【讨论】:

  • localeCompare 是关于什么的,为什么它与 Luis 的回答不同?我从没见过。
  • @Steve From Mdn - localeCompare() 方法返回一个数字,指示引用字符串是在排序顺序之前还是之后或与给定字符串相同。对字符串值进行排序时,最好使用 localeCompare。
【解决方案2】:

试试这个

products.sort(function (a, b) {
  return a.title.rendered - b.title.rendered;
});

您可以导入 lodash/underscore 库,它有许多构建函数可用于操作、过滤、排序数组等等。

使用下划线:(以下仅为示例)

import * as _ from 'underscore';
let sortedArray = _.sortBy(array, 'title'); 

【讨论】:

    【解决方案3】:

    未经测试,但应该可以工作

     products.sort((a,b)=>a.title.rendered > b.title.rendered)
    

    【讨论】:

    • 是的。谢谢,当我在 MDN 上阅读 a、b 比较时,我真的很困惑。
    • 虽然这通常会起作用,但它不是一个一致的比较函数 - 它不是对称的。
    • @ASDFGerte 你能详细说明一下吗?有什么更好的方法?
    • @Steve 您是否查看过(目前被投票五次)重复建议的最佳答案?请注意,正如许多人已经建议的那样,localeCompare 已经存在,无需重新发明轮子。
    猜你喜欢
    • 2011-05-16
    • 2022-06-30
    • 2015-03-11
    • 1970-01-01
    • 2016-11-25
    • 2014-10-01
    相关资源
    最近更新 更多