Skip to content

Commit

Permalink
fix(observable-array): reduce no longer ignores zero as initial value (
Browse files Browse the repository at this point in the history
…#6402)

* fix(observable-array): reduce no longer ignores zero as initial value

* fix(observable-array): reduceRight now functions  properly when initial value is not specified or zero
  • Loading branch information
surdu authored and Alexander Vakrilov committed Oct 19, 2018
1 parent a3f1493 commit c0438df
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 4 deletions.
28 changes: 28 additions & 0 deletions tests/app/data/observable-array-tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -646,6 +646,34 @@ export const test_reduce_with_initial_value = function () {
TKUnit.assertEqual(result, 11, "ObservableArray reduce function broken when Initial Value is passed.");
};

export const test_reduce_with_zero_as_initial_value = function () {
const sa = [{prop: 1}, {prop: 2}, {prop: 3}];
let array: ObservableArray<any> = new ObservableArray(sa);
const result = array.reduce((a, b) => a + b.prop, 0);
TKUnit.assertEqual(result, 6, "ObservableArray reduce function broken when Initial Value is zero.");
};

export const test_reduceRight_isDefined = function () {
TKUnit.assert(typeof (array.reduceRight) === "function", "Method 'reduceRight()' should be defined!");
};

export const test_reduceRight_without_initial_value = function () {
const sa = [1, 2, 3];
let array: ObservableArray<number> = new ObservableArray(sa);
const result = array.reduceRight((a, b) => a + b);
TKUnit.assertEqual(result, 6, "ObservableArray reduceRight function broken when initialValue is missing");
};

export const test_reduceRight_with_initial_value = function () {
const sa = [1, 2, 3];
let array: ObservableArray<number> = new ObservableArray(sa);
const result = array.reduceRight((a, b) => a + b, 5);
TKUnit.assertEqual(result, 11, "ObservableArray reduceRight function broken when Initial Value is passed.");
};

export const test_reduceRight_with_zero_as_initial_value = function () {
const sa = [{prop: 1}, {prop: 2}, {prop: 3}];
let array: ObservableArray<any> = new ObservableArray(sa);
const result = array.reduceRight((a, b) => a + b.prop, 0);
TKUnit.assertEqual(result, 6, "ObservableArray reduceRight function broken when Initial Value is zero.");
};
8 changes: 4 additions & 4 deletions tns-core-modules/data/observable-array/observable-array.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import * as observable from "../observable";
import * as observable from "../observable";
import * as observableArrayDef from ".";
import * as types from "../../utils/types";

Expand Down Expand Up @@ -314,7 +314,7 @@ export class ObservableArray<T> extends observable.Observable implements observa
* @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
*/
reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T {
return initialValue ? this._array.reduce(callbackfn, initialValue) : this._array.reduce(callbackfn);
return initialValue !== undefined ? this._array.reduce(callbackfn, initialValue) : this._array.reduce(callbackfn);
}

/**
Expand All @@ -323,12 +323,12 @@ export class ObservableArray<T> extends observable.Observable implements observa
* @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
*/
reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T {
return this._array.reduceRight(callbackfn, initialValue);
return initialValue !== undefined ? this._array.reduceRight(callbackfn, initialValue) : this._array.reduceRight(callbackfn);
}
}

export interface ObservableArray<T> {
on(eventNames: string, callback: (data: observable.EventData) => void, thisArg?: any);

on(event: "change", callback: (args: observableArrayDef.ChangedData<T>) => void, thisArg?: any);
}
}

0 comments on commit c0438df

Please sign in to comment.