javascript - Angular 4'te birden fazla sütuna göre gruplandırma
Angular 4'te bir diziyi gruplayarak işlem yapmaya çalışıyorum. Diziyi gruplayabilmek için özel pipe yaklaşımını kullanıyorum, aşağıda bulduğum şekilde:
https://www.competa.com/blog/custom-groupby-pipe-angular-4/
Ama birden fazla sütuna göre gruplamaya çalışıyorum.
Veri
var myArray = [
{
name: "Apple",
color: "Green",
grade: "A1"
},
{
name: "Apple",
color: "Red",
grade: "A1"
},
{
name: "Apple",
color: "Green",
grade: "A2"
},
{
name: "Apple",
color: "Red",
grade: "A2"
},
];
Burada birden fazla sütuna göre gruplamak istiyorum, örneğin, isim ve Not.
Bunu kullanmayı denedim ama faydası olmadı:
<li *ngFor="let object of myArray | groupBy:'name,grade'"></li>
Lütfen bu sorunu çözmek için değerli çözümlerinizi sağlayın. Yardımınız için teşekkür ederim. Teşekkürler.
Cevap #1
Bileşende dizinizi reduce fonksiyonunu kullanarak gruplayabilirsiniz :
groups = Object.values(this.myArray.reduce(function(r, e) {
var key = e.name + '|' + e.grade;
if (!r[key]) r[key] = e;
else {
r[key].color = e.color;
}
return r;
}, {}));
https://jsfiddle.net/ov4nx7ad/
Cevap #2
Benim açımdan en iyi yol lodash kullanmaktır.
HTML:-
<ul>
<li *ngFor="let object of myArray | groupBy:['color','name']"></li>
</ul>
Boru:-
import { Pipe, PipeTransform } from '@angular/core';
import * as _ from 'lodash';
@Pipe({name: 'groupBy'})
export class GroupByPipe implements PipeTransform {
transform(collection: Array, property: Array): Array {
if(!collection) {
return null;
}
var notNull = _.negate(_.isNull);
const groupedCollection = _.groupBy(collection, function(note){
return _.find(_.pick(note, property), notNull);
});
return Object.keys(groupedCollection).map(key => ({ key, value: groupedCollection[key] }));
}
}
