0

特定の関数でさまざまな配列を使用する必要がありますが、非常に非効率的な方法でそれを実行していると思わずにはいられません。

function GetTimeLeft(){
var TimeUnformatted = document.querySelectorAll('[id="SomeIdName"]')[0].innerText.match(/\d{1,}d\s\d{1,}h/ig);
var i;
if (TimeUnformatted){
    var Daysunformatted = [];
    var Hoursunformatted = [];
    var DaysFormatted = [];
    var HoursFormatted = [];
    var DaysToSeconds = [];
    var HoursToSeconds = [];
    var TimeInSeconds = [];
    for (i=0;i<TimeUnformatted.length;i++){
        Daysunformatted[i]  = TimeUnformatted[i].match(/\d{1,}d/)[0];
        Hoursunformatted[i] = TimeUnformatted[i].match(/\d{1,}h/)[0];
        if (Daysunformatted[i])  DaysFormatted[i]  = Number(Daysunformatted[i].match(/\d{1,}/)[0]);
        if (Hoursunformatted[i]) HoursFormatted[i] = Number(Hoursunformatted[i].match(/\d{1,}/)[0]);

        if (DaysFormatted[i])  DaysToSeconds[i]  = DaysFormatted[i]*24*60*60;
        if (HoursFormatted[i]) HoursToSeconds[i] = HoursFormatted[i]*60*60;

        if (DaysToSeconds[i] && HoursToSeconds[i]) TimeInSeconds[i] = DaysToSeconds[i] + HoursToSeconds[i];
    }
    return TimeInSeconds;//an Array.
} else {
    return [0];
}

}

編集:明確にするために、私は自分自身を非常に貧弱に表現したので。最初のvarステートメントを使用せずに「外出先での割り当て」を試しましたが、JavaScriptが叫び、「[」を予期していなかったと言っています。

function GetTimeLeft(){
var TimeUnformatted = document.querySelectorAll('[id="SomeIdName"]')[0].innerText.match(/\d{1,}d\s\d{1,}h/ig);
var i;
if (TimeUnformatted){
    for (i=0;i<TimeUnformatted.length;i++){
        var Daysunformatted[i]  = TimeUnformatted[i].match(/\d{1,}d/)[0];
        var Hoursunformatted[i] = TimeUnformatted[i].match(/\d{1,}h/)[0];
        if (Daysunformatted[i])  var DaysFormatted[i]  = Number(Daysunformatted[i].match(/\d{1,}/)[0]);
        if (Hoursunformatted[i]) var HoursFormatted[i] = Number(Hoursunformatted[i].match(/\d{1,}/)[0]);

        if (DaysFormatted[i])  var DaysToSeconds[i]  = DaysFormatted[i]*24*60*60;
        if (HoursFormatted[i]) var HoursToSeconds[i] = HoursFormatted[i]*60*60;

        if (DaysToSeconds[i] && HoursToSeconds[i]) var TimeInSeconds[i] = DaysToSeconds[i] + HoursToSeconds[i];
    }
    return TimeInSeconds;//an Array.
} else {
    return [0];
}

複数の割り当てを行うことができることは知っていますが、それでも、自分がやりたいことを行うためのより良い方法はありませんか?

4

1 に答える 1

1

そのコード行の問題はvarです。をドロップするvarと、上記のコードと同じように機能します。

Daysunformatted[i]  = TimeUnformatted[i].match(/\d{1,}d/)[0];

コードの改善を確認できる唯一の方法は、正規表現をforループの外に移動することです。

var reDays = /\d{1,}d/;
var reHours = /\d{1,}h/;
for (i=0;i<TimeUnformatted.length;i++){
        Daysunformatted[i]  = TimeUnformatted[i].match(reDays)[0];
        Hoursunformatted[i] = TimeUnformatted[i].match(reHours)[0];

また、キャプチャグループを使用して時間を取得できるため、d/hを落とす2番目の一致を実行する必要はありません。

var reDays = /(\d{1,})d/;
var TimeUnformatted = "10d 1h";
 Daysunformatted[i]  = (TimeUnformatted[i].match(reDays) || [,])[1];
于 2013-03-21T13:17:46.303 に答える