Ian Boyd
Ian Boyd

Reputation: 256621

How to call array reduce in TypeScript?

I am trying to find the largest item in an array.

It was simple enough to solve using the straight-forward, simple, clean, elegant, fast method - iterating the array:

private GetMaxValue(data: Array<RealtimeDataPoint>): number {
    if (data.length === 0)
        return 0;

    var maxValue = data[0].Value;

    for (var i: number = 1; i < data.length; i++) {
        if (data[i].Value > maxValue)
            maxValue = data[i].Value;
    }

    return maxValue;
}

But that's not cool

Then, rather than solving the problem using the easy way, i wanted to try to solve it using .reduce:

private GetMaxValue(data: Array<RealtimeDataPoint>): number {
    var pt: RealtimeDataPoint = data.reduce(function (previousValue: RealtimeDataPoint, currentValue: RealtimeDataPoint, currentIndex: number, array: Array<RealtimeDataPoint>): RealtimeDataPoint {
        if (currentValue.Value > previousValue.Value)
            return currentValue;
        else
            return previousValue;
    });

    if (pt != null)
        return pt.Value;
    else
        return 0;
}

And it's great, and it compiles and all. But it crashes at runtime:

Object doesn't support this action

It seems to indicate that something on the var pt: RealtimeDataPoint = data.reduce(...) line doesn't work, since that's the line it stalls on:

enter image description here

And it's not the .reduce member that it doesn't support, because that's there.

So, two questions:

Bonus Chatter

Upvotes: 1

Views: 9421

Answers (2)

Tim
Tim

Reputation: 1018

I would use something like Math.max(0, ...data.map(({Value})) => Value)).

Upvotes: 0

Ian Boyd
Ian Boyd

Reputation: 256621

Solved it.

The error message from Internet Explorer 11 is:

Object doesn't support this action

The error message from Chrome 32 is:

enter image description here

Reduce of empty array with no initial value

With that the fix is simple; borrow something from the elegant solution:

private GetMaxValue(data: Array<RealtimeDataPoint>): number {
    if (data.length === 0)
       return 0;

    var pt: RealtimeDataPoint = data.reduce(function (previousValue: RealtimeDataPoint, currentValue: RealtimeDataPoint, currentIndex: number, array: Array<RealtimeDataPoint>): RealtimeDataPoint {
        if (currentValue.Value > previousValue.Value)
            return currentValue;
        else
            return previousValue;
    });

    if (pt != null)
        return pt.Value;
    else
        return 0;
}

Given the verbosity of the reduce pattern, and the associated performance penalty, i think i'll stick with the elegant solution.

But at least now there's an example of the reduce syntax in TypeScript.

Note: Any code released into public domain. No attribution required.

Upvotes: 2

Related Questions