【问题标题】:How to call array reduce in TypeScript?如何在 TypeScript 中调用数组减少?
【发布时间】:2014-02-23 21:01:32
【问题描述】:

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

使用直截了当、简单、干净、优雅、快速的方法来解决问题非常简单——迭代数组:

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 没有意识到我的语法有问题?

奖金聊天

  • Internet Explorer 11
  • 铬 32

【问题讨论】:

  • 您使用的是哪个浏览器?您是否尝试过在其他代码中运行您的代码?

标签: javascript typescript


【解决方案1】:

解决了。

来自 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 模式和associated performance penalty 的冗长,我想我会坚持使用优雅的解决方案。

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

注意:任何发布到公共领域的代码。无需署名。

【讨论】:

  • 投反对票,因为: 1. 这是一篇非常非常长的帖子,要指出 [].reduce(function() { }) 是一个运行时错误,甚至不是 TypeScript -具体的事情2。为什么你的reduce函数有2个额外的未使用参数? 3. 为什么你的reduce 函数有一堆额外的类型注释,而它已经是上下文类型的? 4. 原始帖子没有告诉我们“数据”中有什么 5.“Chrome 32”在“奖金聊天”中,但它给您的错误消息是问题的答案?
  • @RyanCavanaugh 正如 StackOverflow 所说,我应该展示研究成果。 a)这是我没有编写的代码中的运行时错误(Typescript 编译器编写了它,可能是生成的代码中有问题)b)因为回调函数签名应该与所需的回调签名匹配 c)因为我尝试了有无键入,但仍然失败 d) data 中的数据无关紧要;第一个算法在不知道data 是什么的情况下工作 e) 操作顺序;我用我试过的浏览器更新了问题。
  • @RyanCavanaugh 哦,更重要的是,如果我们忽略了你脾气暴躁的所有事情,当我发布这个问题时,我不知道答案是什么。一旦有了解决方案,就很容易实现解决方案。所以当我没有解决方案时,我不知道它是否与打字稿有关 - 或者它与 what 相关。事实证明,的东西在 TypeScript 中是行不通的。 You would think they would work, but they just don't。我认为reduce 是另一种极端情况。
【解决方案2】:

我会使用 Math.max(0, ...data.map(({Value})) =&gt; Value)) 之类的东西。

【讨论】:

    猜你喜欢
    • 2017-06-12
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    相关资源
    最近更新 更多