2013-03-21 2 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]; 
} 

}

Редактировать : Прояснить, так как я выразил себя очень плохо. я пытался «возлагая на ходу», без первоначальных заявлений вар Но в 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]; 

И вы можете использовать группы захвата, чтобы получить часы, так что вам не придется делать второй матч, который роняет д/ч.

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

Thanks epascarello! У меня есть два вопроса. 1) Ваш первый совет, присваивающий без var 'Daysunformatted [i] = TimeUnformatted [i] .match (/ \ d {1,} d /) [0];', похоже, не беспокоит, например 'Daysunformatted [0 ] = 3' дает мне _ReferenceError: Daysunformatted не определен_. 2) Зачем переставлять регулярное выражение за пределы цикла? Я честно спрашиваю об этом, так как я заметил, что люди делают это, и это должно дать какое-то преимущество. Наконец, действительно спасибо за советы «группы захвата», это намного умнее моего предыдущего метода. – ShizukaSM

+0

Вы должны убедиться, что 'Daysunformatted' уже объявлен заранее. AKA 'var Daysunformatted = [];' – epascarello

+0

О, я вижу, что вы думали, что я сделал, я объяснил себе неправильно. Я отредактировал сообщение для ясности. – ShizukaSM