3

PhonegapとJQueryを使用してアプリを構築しています。

アプリは(window.localStorageを使用して)一連の時間(10以下)を形式で保存します。

    HH:MM:SS.mm

リストには、iphonegap、javascriptが使用を排除する「00:00:00.00」などの「ゼロ」回がいくつかあります。

    function removeA(arr){
        var what, a= arguments, L= a.length, ax;
        while(L> 1 && arr.length){
            what= a[--L];
            while((ax= arr.indexOf(what))!= -1){
                arr.splice(ax, 1);
            }
        }
        return arr;
    }

    scores.sort();
    removeA(scores,'00:00:00.00');

そのため、最初に最速の時間が残り、値のある時間だけが残ります。

残りの値からそれらの時間の平均を生成する必要があります。

eg:  00:00:03.00
     00:00:05.00
     00:00:02.00
     00:00:06.00

=    00:00:04.00

前もって感謝します :)

4

4 に答える 4

2

ミリ秒の値もあり、それらを考慮したい場合は、時間をミリ秒に変換します。次に、それらを追加し、レコード数で除算します。それ以外の場合は、すべてを秒に変換して平均を求めます。もちろん、答えは数秒で得られます。

少し時間をかけて考えれば、変換は非常に簡単です。変換する方法は次のとおりです。

ミリ秒単位:

function convertToMS(timeStr) {      // timeStr in format 'HH:MM:SS.mm'
    var I = parseInt;  // for brevity
    var t = timeStr,
        h = I( t.substr(0,2) ),
        m = I( t.substr(3,2) ),
        s = I( t.substr(6,2) ),
        ms = I( t.substr(9,2) );

    return h * 3600000 + m * 60000 + s * 1000 + ms;
}

秒単位で:

function convertToS(timeStr) {      // timeStr in format 'HH:MM:SS[.mm]'  -- .mm is ignored.
    var I = parseInt;  // for brevity
    var t = timeStr,
        h = I( t.substr(0,2) ),
        m = I( t.substr(3,2) ),
        s = I( t.substr(6,2) );

    return h * 3600 + m * 60 + s;
}

変換が完了したら、それらを合計して平均を求めます。

更新: 「HH:MM:SS.mm」の形式に戻すために、時間を「チャンク」の時間、分、秒、および(該当する場合は)ミリ秒に戻します。

function chunkifyFromSec(time) {  // time in s
    var t = "",
        h = Math.floor(time / 3600),
        m = Math.floor( (t - (h * 3600)) / 60 ),
        s = t - (h * 3600) - (m * 60);
    return {
        HH: h, MM: m, SS: s, mm: 0
    };
}
function chunkifyFromMS(time) {   // time in ms
    var t = "",
        h = Math.floor(time / 3600000),
        m = Math.floor( (t - (h * 3600000)) / 60000 ),
        s = Math.floor( (t - (h * 3600000) - (m * 60000)) / 1000 ),
        mm = t - (h * 3600000) - (m * 600000) - (s * 1000);
    return {
        HH: h, MM: m, SS: s, mm: mm
    };
}

次に、次のコマンドを使用して、文字列を「HH:MM:SS.mm」の形式で返します。

function toTimeStr(chunks) {
    return
           (chunks.HH < 0 ? '0' : '') + chunks.HH + ":"
           += (chunks.MM < 0 ? '0' : '') + chunks.MM + ":"
           += (chunks.SS < 0 ? '0' : '') + chunks.SS + "."
           += (chunks.mm < 0 ? '0' : '') + chunks.mm
}
于 2012-05-06T10:54:03.537 に答える
2
var times= [ '00:00:03.00', '00:00:05.00', '00:00:02.00', '00:00:06.00'],
    date = 0,
    result = '';
function offsetify(t){
    return t < 10 ? '0' + t : t;
}
for(var x = 0; x < times.length; x++ ) {
    var tarr = times[x].split(':');
    date += new Date(0, 0, 0, tarr[0], tarr[1], tarr[2].split('.')[0], tarr[2].split('.')[1]).getTime();   
}
var avg = new Date(date/times.length);
result = offsetify(avg.getHours()) + ':' + offsetify(avg.getMinutes()) + ':' + offsetify(avg.getSeconds()) + '.' + offsetify(avg.getMilliseconds());

デモ

于 2012-05-06T12:01:42.107 に答える
1

私はJavascriptの経験があまりないので、構文エラーが発生する可能性がありますが、次のようなことができると思います

var i = 0;
var totalTime = 0.0;
for (i=0; i < scores.length; i++) {
    var hours = parseFloat(scores[i].substring(0, 2)); //get numeric value for hours
    var minutes = parseFloat(scores[i].substring(3,5)); //get numeric value for minutes
    var seconds = parseFloat(scores[i].substring(6)); //get numeric for the seconds

    var time = ((hours * 60) + minutes) * 60 + seconds; //60 minutes in an hour, 60 seconds in a minute
    totalTime += time;
}

var avgTime = totalTime/scores.length;

var avgHours = Math.floor(avgTime / 3600); //60*60
var avgHoursStr = String(avgHours);

var avgMinutes = Math.floor((avgTime % 3600) / 60); //mod to get rid of the hours
var avgMinutesStr = String(avgMinutes);

var avgSeconds = avgTime - avgHours*3600 - avgMinutes*60; //get the remainder. Can't use mod due to decimal
var avgSeconds = String(avgSeconds);

//Concat strings. Add the ":" spacers. Where necessary, add leading 0
var avgStr = (avgHoursStr.length > 1 ? "" : "0") + avgHoursStr + ":" + (avgMinutesStr.length > 1 ? "" : "0") + avgMinuteStr + ":" + avgSecondsStr;

[編集-私の問題を指摘してくれたParthThakkarに感謝します]

于 2012-05-06T11:10:43.917 に答える
0

ミリ秒または秒で回答を返すには:

var times = ["00:00:03.00", "00:00:05.00", "00:00:02.00", "00:00:06.00"];

function averageTimes(times,unit) {
    if (!times) {
        return false;
    }
    else {
        var totalMilliseconds = 0, hours, minutes, seconds, milliseconds, parts;
        for (var i = 0, len = times.length; i < len; i++) {
            parts = times[i].split(':');
            hours = parseInt(parts[0], 10) * 3600000;
            minutes = parseInt(parts[1], 10) * 60000;
            seconds = parseInt(parts[2].split('.')[0], 10) * 1000;
            milliseconds = parseInt(parts[2].split('.')[1], 10);
            totalMilliseconds += (hours + minutes + seconds + milliseconds);
        }
        if (!unit || unit.toLowerCase() == 'ms'){
            return totalMilliseconds/times.length + ' milliseconds';
        }
        else if (unit.toLowerCase() == 's') {
            return (totalMilliseconds/1000)/times.length + ' seconds';
        }

    }
}

// parameters:
// times: an array of times in your supplied format, 'HH:MM:SS:mm',
// unit: a string ('ms' or 's'), denoting whether to return milliseconds or seconds.
var average = averageTimes(times,'s');
console.log(average);​

JSフィドルデモ

参照:

于 2012-05-06T11:08:56.630 に答える