0

我有大量具有 p 和 u 属性的功能。我想在数组中找到最小和最高的 p 和 u 并在循环中创建这个 switch 语句。这在大约 99.9% 的时间内有效。然而。我有一个数据集,其中最大值和最小值是相同的,即使这些值分布均匀并且平均值不同。难住了。

            switch(true) {
                case p > max_p:
                    max_p = p;
                case u > max_u:
                    max_u = u;
                case p < min_p:
                    min_p = p;
                case u < min_u:
                    min_u = u;
            }

我在 firebug 中运行循环,可以看到如果 u < max_u,max_u 有时会更新。例如 u = 0.066,max_u = 0.088。

Pycharm 告诉我一个失败的问题,但该语句在我扔给它的所有其他数据集上都可以正常工作。

我可以将声明一分为二。性能损失很小,但我想了解这是如何发生的。

谢谢,丹尼斯

编辑:

拆分为两个语句,数据集完全正常工作,语句中没有中断。

            switch(true) {
                case p > max_p:
                    max_p = p;
                case p < min_p:
                    min_p = p;
            }
            switch(true) {
                case u > max_u:
                    max_u = u;
                case u < min_u:
                    min_u = u;
            }

编辑:我接受了给出的答案,但我仍然不明白为什么会发生这样的事情。

在此处输入图像描述

4

1 回答 1

3

假设您有一组具有up属性的对象(如果我已经正确阅读了问题),这里有一个简单的函数,它将为您提供所需的最小/最大值,并为您节省使用switch和/或if条件的问题。

var arr = [
 { p: 10, u: 101},
 { p: 11, u: 1},
 { p: 1, u: 3},
 { p: 2, u: 7},
 { p: 21, u: 1011},
 { p: 6, u: 2},
 { p: 2, u: 13}
]

function getInt(arr, key, type) {
  return Math[type].apply(null, arr.map(function (el) {
    return el[key];
  }));
}

var min_p = getInt(arr, 'p', 'min'); // 1
var max_p = getInt(arr, 'p', 'max'); // 21
var min_u = getInt(arr, 'u', 'min'); // 1
var max_u = getInt(arr, 'u', 'max'); // 1001

演示

于 2016-02-19T18:49:19.510 回答