如何在TypeScript中调用数组reduce?

时间:2014-02-23 21:01:32

标签: javascript typescript

我正在尝试找到数组中最大的项目。

使用直接,简单,干净,优雅,快速的方法解决这个问题很简单 - 迭代数组:

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;
}

但那并不酷

然后,我不想用简单的方法解决问题,而是想尝试使用.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;
}

它很棒,而且它可以编译。但它在运行时崩溃了:

  

对象不支持此操作

似乎表明var pt: RealtimeDataPoint = data.reduce(...)行上的某些内容不起作用,因为它就是它停止的行:

enter image description here

并不是它不支持的.reduce成员,因为那就是那里。

所以,有两个问题:

  • 我的语法出了什么问题?
  • 为什么TypeScript没有意识到我的语法有问题?

Bonus Chatter

  • Internet Explorer 11
  • Chrome 32

2 个答案:

答案 0 :(得分:1)

解决了它。

Internet Explorer 11的错误消息是:

  

对象不支持此操作

Chrome 32的错误消息是:

enter image description here

  

减少没有初始值的空数组

这样修复很简单;从优雅的解决方案中借鉴一些东西:

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;
}

考虑到reduce模式和associated performance penalty的详细程度,我认为我会坚持使用优雅的解决方案。

但至少现在有一个TypeScript中reduce语法的例子。

  

注意:任何已发布到公共领域的代码。无需归属。

答案 1 :(得分:0)

我会使用类似 Math.max(0, ...data.map(({Value})) => Value)) 的东西。