web-dev-qa-db-ja.com

Angular 6のオブジェクトフィールドでオブジェクトの配列を並べ替え

JSONエンドポイントからデータを取得するリゾルバーから一連の「製品」を取得しています。

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

この配列内のオブジェクトの1つは次の形式です

 {
    "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のようにデータ自体をソートすることをお勧めします。

しかし、productsproducs.title.renderedでソートする方法がわかりません。

10
Steve

単に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);
26
amrender singh

試してみてください

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

または

Lodash/underscoreライブラリをインポートできます。このライブラリには、配列などを操作、フィルタリング、ソートするための多くのビルド関数があります。

アンダースコアの使用:(以下は単なる例です)

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

テストされていませんが、動作するはずです

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