gpt4 book ai didi

javascript - 在数组中,如何找到给定浮点值的最接近的键?

转载 作者:行者123 更新时间:2023-11-29 17:15:22 26 4
gpt4 key购买 nike

我正在制作这样的“加速度”数组:

acc["0100"] = 1;
acc["0300"] = 2;
acc["0600"] = 4;
acc["0900"] = 8;
acc["2000"] = 16;
acc["5000"] = 32;

并且,当用户按下一个键时,我启动一个计时器:this._startTick = (new Date()).getTime();

现在我有一个计时器来检查按键是否仍被按下。如果是这样,那么我会做类似的事情:

this._delay = (new Date()).getTime() - this._startTick;

现在,根据 this._delay,我想找到以前的值之一(1、2、4 或 8)。你会怎么做?

注意:如果值大于“5.0”,则结果应始终为 32

注意:我的目标是,给定耗时,找出最佳值。我按照刚才解释的方式开始,但如果您有其他解决方案,我会采用!

最佳答案

操作数组比操作对象更容易:

var accArr = [];
for (time in acc) {
accArr.push({time: time, value: acc[time]});
}

假设你有一个数组,你可以这样做:

function getValue(delay) {
var diffs = accArr.map(function (e) { return Math.abs(e.time - delay); });
return accArr[diffs.indexOf(Math.min.apply(null, diffs))].value;
}

编辑:

好吧,您没有提到这是一个性能关键函数。在这种情况下,我建议选择一个粒度(例如 0.05,因此延迟的乘数是 20)并从 0 开始预先计算所有值> 到 MAX_DELAY:

var multiplier = 20,
granularity = 1 / multiplier;

var delayValues = (function () {
var result = [];
for (var delay = 0; delay <= MAX_DELAY; delay += granularity) {
result.push(getValue(delay));
}
return result;
})();

在动画期间,获取值将是一个相对较小的表中的简单查找:

function getValueFast(delay) {
return (delayValues[Math.round(delay * multiplier)] ||
delayValues[delayValues.length - 1])
}

JSPerf comparison此解决方案与简单的 if 语句之间的比较表明,它们在搜索中间值时执行得同样快。

关于javascript - 在数组中,如何找到给定浮点值的最接近的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18491241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com