filter method for array state

This commit is contained in:
Niels Lyngsø
2023-01-25 09:59:24 +01:00
parent 043d2ec9a8
commit f7045e6718
2 changed files with 74 additions and 9 deletions

View File

@@ -33,12 +33,38 @@ describe('ArrayState', () => {
}); });
it('remove method, removes the one with the key', (done) => {
const expectedData = [initialData[0], initialData[2]];
subject.remove(['2']);
const observer = subject.asObservable();
observer.subscribe((value) => {
expect(JSON.stringify(value)).to.be.equal(JSON.stringify(expectedData));
done();
});
});
it('filter method, removes anything that is not true of the given predicate method', (done) => {
const expectedData = [initialData[0], initialData[2]];
subject.filter(x => x.key !== '2');
const observer = subject.asObservable();
observer.subscribe((value) => {
expect(JSON.stringify(value)).to.be.equal(JSON.stringify(expectedData));
done();
});
});
it('add new item via appendOne method.', (done) => { it('add new item via appendOne method.', (done) => {
const newItem = {key: '4', another: 'myValue4'}; const newItem = {key: '4', another: 'myValue4'};
subject.appendOne(newItem); subject.appendOne(newItem);
const expectedData = [...initialData, newItem] const expectedData = [...initialData, newItem];
const observer = subject.asObservable(); const observer = subject.asObservable();
observer.subscribe((value) => { observer.subscribe((value) => {

View File

@@ -21,6 +21,7 @@ export class ArrayState<T> extends DeepState<T[]> {
/** /**
* @method append * @method append
* @param {unknown} unique - The unique value to remove. * @param {unknown} unique - The unique value to remove.
* @returns ArrayState<T>
* @description - Remove some new data of this Subject. * @description - Remove some new data of this Subject.
* @example <caption>Example remove entry with key '1'</caption> * @example <caption>Example remove entry with key '1'</caption>
* const data = [ * const data = [
@@ -31,23 +32,52 @@ export class ArrayState<T> extends DeepState<T[]> {
* mySubject.remove([1]); * mySubject.remove([1]);
*/ */
remove(uniques: unknown[]) { remove(uniques: unknown[]) {
const unFrozenDataSet = [...this.getValue()]; let next = this.getValue();
if (this._getUnique) { if (this._getUnique) {
uniques.forEach( unique => uniques.forEach( unique => {
unFrozenDataSet.filter(x => { next = next.filter(x => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment // eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore // @ts-ignore
return this._getUnique(x) !== unique; return this._getUnique(x) !== unique;
}) })
}
); );
this.next(unFrozenDataSet); this.next(next);
} }
return this;
}
/**
* @method filter
* @param {unknown} filterMethod - The unique value to remove.
* @returns ArrayState<T>
* @description - Remove some new data of this Subject.
* @example <caption>Example remove entry with key '1'</caption>
* const data = [
* { key: 1, value: 'foo'},
* { key: 2, value: 'bar'},
* { key: 3, value: 'poo'}
* ];
* const mySubject = new ArrayState(data, (x) => x.key);
* mySubject.filter((entry) => entry.key !== 1);
*
* Result:
* [
* { key: 2, value: 'bar'},
* { key: 3, value: 'poo'}
* ]
*
*/
filter(predicate: (value: T, index: number, array: T[]) => boolean) {
this.next(this.getValue().filter(predicate));
return this;
} }
/** /**
* @method append * @method append
* @param {Partial<T>} partialData - A object containing some of the data for this Subject. * @param {Partial<T>} partialData - A object containing some of the data for this Subject.
* @returns ArrayState<T>
* @description - Append some new data to this Subject. * @description - Append some new data to this Subject.
* @example <caption>Example append some data.</caption> * @example <caption>Example append some data.</caption>
* const data = [ * const data = [
@@ -59,11 +89,13 @@ export class ArrayState<T> extends DeepState<T[]> {
*/ */
appendOne(entry: T) { appendOne(entry: T) {
this.next(appendToFrozenArray(this.getValue(), entry, this._getUnique)) this.next(appendToFrozenArray(this.getValue(), entry, this._getUnique))
return this;
} }
/** /**
* @method append * @method append
* @param {T[]} entries - A array of new data to be added in this Subject. * @param {T[]} entries - A array of new data to be added in this Subject.
* @returns ArrayState<T>
* @description - Append some new data to this Subject, if it compares to existing data it will replace it. * @description - Append some new data to this Subject, if it compares to existing data it will replace it.
* @example <caption>Example append some data.</caption> * @example <caption>Example append some data.</caption>
* const data = [ * const data = [
@@ -79,5 +111,12 @@ export class ArrayState<T> extends DeepState<T[]> {
append(entries: T[]) { append(entries: T[]) {
// TODO: stop calling appendOne for each but make sure to handle this in one. // TODO: stop calling appendOne for each but make sure to handle this in one.
entries.forEach(x => this.appendOne(x)) entries.forEach(x => this.appendOne(x))
/*
const unFrozenDataSet = [...this.getValue()];
this.next(unFrozenDataSet);
*/
return this;
} }
} }