2017-08-02 26 views
3

我必须构造一个对象数组。我可以“长手”,但我希望找到一种方法来遍历一些变量,并检查每个变量,将它们“推”到数组中的正确位置。使用相同的“规则”检查多个变量

我有这样的:完美在上面的例子

//this is the starting array...I'm going to update these objects 
    operationTime = [ 
{"isActive":false,"timeFrom":null,"timeTill":null},//Monday which is operationTime[0] 
{"isActive":false,"timeFrom":null,"timeTill":null}, 
{"isActive":false,"timeFrom":null,"timeTill":null}, 
{"isActive":false,"timeFrom":null,"timeTill":null}, 
{"isActive":false,"timeFrom":null,"timeTill":null}, 
{"isActive":false,"timeFrom":null,"timeTill":null}, 
{"isActive":false,"timeFrom":null,"timeTill":null} 
]; 

//I get the below via an API call 
var monHours = placeHours.mon_open_close; 
var tueHours = placeHours.tue_open_close; 
var wedHours = placeHours.wed_open_close; 
var thuHours = placeHours.thu_open_close; 
var friHours = placeHours.fri_open_close; 
var satHours = placeHours.sat_open_close; 
var sunHours = placeHours.sun_open_close; 
var sunHours = placeHours.sun_open_close; 


//here's where I'm stuck. 
if (monHours.length>0){ 
    var arr = monHours[0].split("-"); 
    operationTime[0].isActive= true; 
    operationTime[0].timeFrom= arr[0]; 
    operationTime[0].timeTill= arr[1]; 
} 
else { 
    operationTime[0].isActive= false; 
} 

if/else使用作品周一,但我不想写这七天使它过于复杂的一周。我怎么能把这个压缩成一个单独的“函数”来测试每个变量并将它推入数组对象的正确位置?

+1

你为什么设置为参考对象'operationTime [2]'为假,如果周一不存在?这是一个错字吗? – Psidom

+0

@Psidom好赶上...一个错字。 – jonmrich

回答

3

你可以试试这个方法与foreach所有天的时间,

$all_hours = [monHours, tueHours , wedHours , thuHours , friHours , satHours ,sunHours]; 

foreach($all_hours as $k=>$hours){ 
    if ($hours.length>0){ 
    $arr = $hours[k].split("-"); 
    operationTime[$k].isActive= true; 
    operationTime[$k].timeFrom= $arr[0]; 
    operationTime[$k].timeTill= $arr[1]; 
    } 
else { 
    operationTime[$k].isActive = false; 
    } 
} 
+0

谢谢......我错过的部分是'$ all_hours'部分。你让我到了正确的地方。谢谢! – jonmrich

+0

@jonmrich很高兴帮助你。祝你好运... –

4

我想你可以把钥匙放在了一个数组,然后用forEach遍历operationTime和更新对象基于索引:

operationTime = [ 
 
    {"isActive":false,"timeFrom":null,"timeTill":null}, 
 
    {"isActive":false,"timeFrom":null,"timeTill":null}, 
 
    {"isActive":false,"timeFrom":null,"timeTill":null}, 
 
    {"isActive":false,"timeFrom":null,"timeTill":null}, 
 
    {"isActive":false,"timeFrom":null,"timeTill":null}, 
 
    {"isActive":false,"timeFrom":null,"timeTill":null}, 
 
    {"isActive":false,"timeFrom":null,"timeTill":null} 
 
]; 
 

 
// make an array of keys that has the same order of the operationTime 
 
var keys = ['mon_open_close', 'tue_open_close', 'wed_open_close', 'thu_open_close', 'fri_open_close', 'sat_open_close', 'sun_open_close']; 
 

 
var placeHours = {'mon_open_close': ['08:00-17:00'], 'tue_open_close':[], 'wed_open_close':[], 'thu_open_close':[], 'fri_open_close':[], 'sat_open_close':[], 'sun_open_close':['10:20-15:30']} 
 

 
operationTime.forEach((obj, index) => { 
 
    var dayHours = placeHours[keys[index]]; 
 
    if(dayHours.length > 0) { 
 
    var arr = dayHours[0].split("-"); 
 
    obj.isActive= true; 
 
    obj.timeFrom= arr[0]; 
 
    obj.timeTill= arr[1]; 
 
    } 
 
}) 
 

 
console.log(operationTime);

+0

打败我吧:D。你可以使它更短:注意重复:'_open_close'。 –

+1

@ibrahimmahrir当然。我会让它更加优雅。 :) – Psidom

+1

谢谢!也很有帮助!我被困在这里:'//创建一个与operationTime的顺序相同的密钥数组 – jonmrich

0

您可以使用Object.entries()来将对象的属性和值迭代为数组,.map()以定义并包括for..of或其他循环的块中的迭代索引。该指数是利用在阵列indexoperationTime

for (let 
     [key, prop, index] 
    of 
     Object.entries(placeHours) 
     .map(([key, prop], index) => [key, prop, index]))) { 
     if (prop.length > 0) { 
      let [arr] = prop.split("-"); 
      operationTime[index].isActive = true; 
      operationTime[index].timeFrom = arr[0]; 
      operationTime[index].timeTill = arr[1]; 
     } 
}