I am extended my Linq library for Typescript with many more methods! Here is my implementation of DistinctBy.
if (!Array.prototype.DistinctBy) {
Array.prototype.DistinctBy = function <T>(property: (keyof T)): T[] {
if (this === null || this === undefined) {
return [];
}
let filteringArray = this.Select(property).map(n => n[property]);
let distinctRunOnArray = this.filter((value, index, array) => {
let valueProperty = value[property];
return filteringArray.indexOf(valueProperty) === index;
});
return distinctRunOnArray;
}
}
This Jasmine test can test this operator out.
describe('TSLinq Jasmine tests', () => {
it('can filter out duplicates using DistinctBy on array of items of objects', () => {
let someArray: Student[] = [];
someArray.push(<Student>{ StudentID: 1, StudentName: "John", Age: 13 });
someArray.push(<Student>{ StudentID: 2, StudentName: "Moin", Age: 21 });
someArray.push(<Student>{ StudentID: 2, StudentName: "Moin", Age: 21 });
someArray.push(<Student>{ StudentID: 4, StudentName: "Ram", Age: 20 });
someArray.push(<Student>{ StudentID: 5, StudentName: "Ron", Age: 15 });
let expectedArray: Student[] = [];
expectedArray.push(<Student>{ StudentID: 1, StudentName: "John", Age: 13 });
expectedArray.push(<Student>{ StudentID: 2, StudentName: "Moin", Age: 21 });
expectedArray.push(<Student>{ StudentID: 4, StudentName: "Ram", Age: 20 });
expectedArray.push(<Student>{ StudentID: 5, StudentName: "Ron", Age: 15 });
let result = someArray.DistinctBy<Student>("StudentID");
expect(result).toEqual(expectedArray);
});
});
The Student class is simple:
class Student {
StudentID: number;
StudentName: string;
Age: number;
}