繁体   English   中英

如何在 TypeScript 中调用数组减少?

[英]How to call array reduce in 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(...)行上的某些内容不起作用,因为这是它停顿的行:

在此处输入图片说明

它不支持.reduce成员,因为它就在那里。

所以,两个问题:

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

奖金喋喋不休

  • 浏览器 11
  • 铬 32

解决了。

来自 Internet Explorer 11 的错误消息是:

对象不支持此操作

来自 Chrome 32 的错误消息是:

在此处输入图片说明

减少没有初始值的空数组

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

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模式的冗长,以及相关的性能损失,我想我会坚持优雅的解决方案。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM