我的代码是:
var level = function (d) {
if (value(d) > median + stdev) {
return 1;
} else if (value(d) > median) {
return 2;
} else if (value(d) > median - stdev) {
return 3;
} else {
return 4;
}
};有没有更好的方法呢?
发布于 2013-07-16 22:43:36
当然,多次调用value(d)是可以避免的。
您还可以使用symmetry将其缩短一点
var level = function (d) {
//
// -std median +std
// ----------------|-------|-------|------------------
// 4444444444444444 3333333 2222222 111111111111111111
//
var i = Math.floor((median - value(d)) / stddev) + 3;
return Math.max(1, Math.min(4, i));
};然而,对于一个真正的项目来说可能不是一个好主意。我没有测试,但如果我发现这个代码比你问题中的原始代码慢,我也不会感到惊讶,而且我肯定会发现它更难维护。
请注意,排除一次性一次性脚本通常代码是一次编写和多次读取(为了维护,如改进或调试),因此“更容易阅读”通常比“更容易编写”更重要。
当shorter意味着“更容易阅读”是一件好事,当它开始意味着“更难阅读”时就不是了。
发布于 2013-07-16 22:53:14
为了完成这个集合,这里是@austin引用的switch方法:
var level = function (d) {
var d = value(d) - median;
switch (true) {
case d > stdev : return 1;
case d > 0: return 2;
case d > -stdev: return 3;
default: return 4;
}
};发布于 2013-07-16 22:38:19
这个解决方案更好,但我不建议在生产中使用它,因为它有点令人困惑:
4 - [median + stdev, median, median - stdev].filter(function(e, i, a) {
return value(d) > e;
}).length https://stackoverflow.com/questions/17679292
复制相似问题