2013-03-21 88 views
0

我需要在一個特定的功能使用不同的陣列,但我不禁想起我做了一個非常低效的方式:的Javascript分配多個陣列

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]; 
} 

我知道我能做到多任務,不過,ISN有沒有更好的方式去做我想要的?

回答

1

該行代碼的問題是var。刪除var,它的工作方式就像上面的代碼一樣。

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

只有這樣我才能看到改進你的代碼是將reg exp移到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的匹配。

var reDays = /(\d{1,})d/; 
var TimeUnformatted = "10d 1h"; 
Daysunformatted[i] = (TimeUnformatted[i].match(reDays) || [,])[1]; 
+0

謝謝epascarello!不過,我有兩個問題。 1)你的第一個建議是,在沒有var'Daysunformatted [i] = TimeUnformatted [i] .match(/ \ d {1,} d /)[0]的情況下進行賦值;'似乎不是任何人,例如'Daysunformatted [0 ] = 3'給我_ReferenceError:Daysunformatted沒有defined_。 2)爲什麼把正則表達式放在循環之外?我誠實地問,因爲我已經看到人們這樣做,它必須帶來某種優勢。最後,非常感謝「捕獲小組」的建議,它比我以前的方法更聰明。 – ShizukaSM 2013-03-21 13:39:50

+0

您必須確保'Daysunformatted'已被預先聲明。 AKA'var Daysunformatted = [];' – epascarello 2013-03-21 13:42:01

+0

哦,我明白你以爲我做了什麼,我已經向自己解釋錯了。爲了清晰起見,我編輯了該帖子 – ShizukaSM 2013-03-21 13:50:10