无法弄清楚如何在Javascript中扩展Beats Per Minute计数器功能?

时间:2015-06-01 18:53:50

标签: javascript

我编写了这段代码,让用户每次感受到心跳时都会点击鼠标按钮。然后,它将计算第一次和最后一次点击之间的时间,并且如果此步伐继续,它将计算您的BPM。

我想补充的是,它会将大约10个BPM数据(点击)放入一个数组中,然后点击10次后,将根据10个BPM数据计算您的平均心率,它会告诉您这是健康与否。我知道这听起来很简单,但我是javascript的新手,我觉得通过制作这么小的应用程序来学习这门语言真的太棒了,没有更好的学习方法!

如果有人能指出我正确的方向,那就太棒了。

这是我到目前为止所拥有的:

pg_restore

2 个答案:

答案 0 :(得分:1)

因此,我修复了代码的某些部分,包括为您实时计算平均值的方法。

检查这个小提琴,看看这是不是你要找的东西!

http://jsfiddle.net/q85awqsp/2/

主要的是创建var beats = [],然后使用beats.push(Math.floor(bpm))添加值;

这里有完整的JS:

var lastTapSeconds = 0;
var bpm = 0;
var beats = [];
var average = 0;
var count = 0;

var tapDiv = document.getElementById("tapDiv");

$(document).on('click', function() {
    var tapSeconds = new Date().getTime();

    bpm = ((1 / ((tapSeconds - lastTapSeconds) / 1000)) * 60);
    lastTapSeconds = tapSeconds;
    tapDiv.innerHTML = '<h1 style="display:inline;">' + Math.floor(bpm) + '</h1>';
    beats.push(Math.floor(bpm));
    average *= count;
    average += Math.floor(bpm);
    count++;
    average /= count;

    if(beats.length >= 10) {
        alert("Average " + average);
    }
});

答案 1 :(得分:0)

使用Rxjs Observables很容易:

import { fromEvent } from 'rxjs'; 
import { bufferCount, map, pluck, timeInterval } from 'rxjs/operators';

const btn = document.getElementById("btn"); // get button
fromEvent(btn, 'click').pipe(
  timeInterval(), // get interval between clicks in ms
  pluck('interval'), // strips the inverval property
  bufferCount(10,1),  // buffers last 10 values and return a array of them
  map(arr => arr.reduce((a, b) => a + b, 0) / arr.length), // get avarage of the array
  map(ms => Math.round(60000 / ms)), // calculate bpm
).subscribe(bpm => console.log(bpm + ' bpm'));

使用bufferCount,您需要单击10次,直到结果显示在控制台上。 如果要在开始单击时显示正确的bpm,然后继续获取最近10个值的平均值,则将bufferCount行替换为:

.scan((acc, curr) => {
    acc.push(curr);

    if (acc.length > 10) {
        acc.shift();
    }
    return acc;
}, []),