【问题标题】:Idiomatic way of storing largest value in a variable?将最大值存储在变量中的惯用方式?
【发布时间】:2021-06-10 00:44:27
【问题描述】:

假设您有变量 let maximum = 0;,并且您执行以下操作:

for (let someObject of Objects) {
  maximum = someObject.value > maximum ? someObject.value : maximum;
}

我认为这段代码非常难看。如果出现更大的值,目标只是覆盖maximum。但是,要做到这一点,您必须将someObject.valuemaximum 各重复两次,这样既冗长又烦人。

我的问题:有没有更惯用或更优雅的方式来写这个?

这行不通,但是,如果 >> 不是按位运算符而是其他东西,则可以这样写:

maximum >> someObject.value;

这要优雅得多。 Typescript 中是否存在类似的东西?

【问题讨论】:

    标签: javascript node.js reactjs typescript


    【解决方案1】:

    这会创建第二个数组,但希望能满足您对优雅的要求:

    const maximum = Objects.map(o => o.value).reduce((p, c)=>Math.max(p,c));
    

    这减少了原始数组,但很笨拙:

    const maximum = Objects.reduce((m, {value}) => Math.max(m, value), 0);
    

    效用函数可以更清晰:

    const maximum = maxSelect(Objects, o=>o.value);
    
    function maxSelect<T>(a: Array<T>, select: (t:T)=>number) {
      return a.reduce((m, c) => Math.max(m, select(c)), Number.NEGATIVE_INFINITY);
    }
    

    或者你可以写:

    for (let someObject of Objects) {
      maximum = Math.max(maximum, someObject.value);
    }
    

    【讨论】:

    • 你确定第一个版本总是安全的吗? .reduce() 将四个参数传递给 Math.max。除了下一个值和累加器之外,它还传递索引和对数组的引用。在我看来,index 参数可能会把事情搞砸。
    • 天哪,我总是中了这个陷阱,你是对的。本来可以很好的。
    • @kyle_aoki - 如果您在这里使用第一个解决方案,请确保您选择最新的编辑,因为原始版本有问题。另外,请注意对于非常大的数组,这会创建两个全长的临时数组。
    【解决方案2】:

    映射并传播到Math.max:

    const maximum = Math.max(0, ...Objects.map(o => o.value));
    

    【讨论】:

    • 此方案的一个缺点是它创建了一个临时数组并将该数组传递给Math.max()。如果数组很大,则不是最优的。
    • @jfriend00 我不认为这个问题是关于优化性能的,而是惯用的或优雅的。 JavaScript 中几乎所有的函数式编程技术最终都会创建临时数组。
    • 我只是指出一个潜在的缺点。我没有投反对票,这只是对使用此方案的评论,我认为值得指出。
    猜你喜欢
    • 1970-01-01
    • 2013-02-22
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2010-10-10
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多