如何关联两个数组(一个与“打孔时间”,一个与“工作时间”)?

时间:2019-07-19 17:56:24

标签: javascript arrays data-structures

我有两个数组:

1)预定工作日期轮班时间表(每个预定日期可以有多个条目,因为某些人一天之内有多个班次)

2)每个班次的工作时间

例如,

1)['07 / 19/2019','07 / 19/2019','07 / 20/2019','07 / 21/2019']

2)['6','2','8','8']

目标是循环浏览每个日期,并显示每个日期的总工作时间以及各个“班次”。

例如,最终结果应显示:

07/19/2019:8

6,2

07/20/2019:8

8

07/21/2019:8

8

现在,我的代码使用一个数字将每个Date关联在一起,从而在两个数组中循环,因此得到以下输出:

07/19/2019:6

07/19/2019:2

07/20/2019:8

07/20/2019:8

我是JavaScript新手。也许我需要使用“地图”,“减少”或“过滤器”创建某种关联?

我不太确定从哪里开始。

for (let x = 0; x < shifts.length; x++) { 
    shift_date.push(shifts.date);
    shift_hours.push(shifts.hour);
}

for (let y = 0; x < shifts_date.length) {
    htmlOutput += "Date: " + shift_date[y];
    htmlOutput += "Hours Worked: " + shift_hours[y];
}

3 个答案:

答案 0 :(得分:1)

您可以为此使用.reduce()

const dates = ["07/19/2019", "07/19/2019", "07/20/2019", "07/21/2019"];

const hours = ["6", "2", "8", "8"];

const result = dates.reduce((all, curr, ndx) => {
  all[curr] = (all[curr] | 0) + +hours[ndx];
  return all;
}, {});

console.log(result);

答案 1 :(得分:1)

您可以做的是将数组成对存储,并将其放入循环中。我的意思是: 现在,您已完成以下设置:

let shift_dates = ['07/19/2019', '07/19/2019', '07/20/2019', '07/21/2019']
let shift_hours = ['6',          '2',          '8',          '8']

我们可以这样设置:

let shifts = [{'date':'07/19/2019', 'hours':'6'},
             {'date':'07/19/2019', 'hours':'2'},
             {'date':'07/20/2019', 'hours':'8'},
             {'date':'07/21/2019', 'hours':'8'}]

请注意,第一个实现是两个单独的索引数组,而第二个实现是对象数组,其中包含有关移位的信息。作为方便的副作用,此数组结构模仿了数据库如何返回电子表格行。

之后,您可以像以前一样简单地遍历数据:

for(var i = 0; i < shifts.length; i++) {

   let shift = shifts[i]; //This object contains your info
   htmlOutput += "Date: " + shift.date;
   htmlOutput += "Hours Worked:" + shift.hours;
}

请注意,使用此实现,您可以添加更多字段,例如员工姓名或轮班领导。

    let shifts = [{'date':'07/19/2019', 'hours':'6', 'supervisor':'tommy'},
                  {'date':'07/21/2019', 'hours':'8', 'supervisor':'fred'}]; //Row 1
    let x = shifts[1].supervisor; //'fred'

最后,如何遍历这些数据实际上取决于您如何获取它。

TLDR 使用对象数组将数据分组在一起,就像在电子表格的行中一样。

答案 2 :(得分:0)

给出您要创建的数组稍微复杂一点的对象的注释。

在这里,我创建了一个对象来命名事物,然后用值填充它。

最后,您只需使用 { $check=$this->input->post('check'); if($check=="on") { $checkval="IN"; Store value here inline column } else{ $checkval="OUT"; Store value here offline column } } 对象即可获取所需的任何信息。

例如mywork输出:

  

07/19/2019 8

或者您可以像我在这里显示的那样遍历它们。

最后,我添加了一些jQuery代码以在页面中显示此内容,如果需要,可以忽略该部分,仅用于显示如何使用对象。

console.log(mywork.workgroups[0].date,mywork.workgroups[0].totalhours);
var mywork = mywork || {
  workdates: ['07/19/2019', '07/19/2019', '07/20/2019', '07/21/2019', '07/22/2019','07/22/2019'],
  workduration: ['6', '2', '8', '8','7','6'],
  workgroups: [],
  uniquedates: [],
  showWork: function() {
    $.each(this.workgroups, function(index, value) {
      //console.log("dates:", this.workdates);
      let item = $('.item').first().hide().clone();
      item.find('.item-date').html(value.date);
      item.find('.item-total').html(value.totalhours);
      item.find('.item-hours').html("("+value.hours.join(',')+")");
      $('.container').append(item.show());
    })
  }
};

function setThingsUp(w) {
  w.uniquedates = w.workdates
    .filter(function(element, index, thisarray) {
      return thisarray.indexOf(element) === index;
    }, w);

  w.uniquedates.forEach(function(udate, uindex, ar) {
    // console.log("ud:", udate);
    let wg = {
      "date": udate,
      "totalhours": 0,
      "hours": []
    };
    w.workdates
      .forEach(function(element, index, thisarray) {
        if (udate === element) {
          let h = w.workduration[index] * 1;
          wg.hours.push(h);
          wg.totalhours = wg.totalhours + h;
        }
      }, w);
    w.workgroups.push(wg)
  }, w);

 // console.log("u:", w.uniquedates);
 // console.log("wg:", w.workgroups);
}

setThingsUp(mywork);
//console.log("work:", mywork.workdates);
// console.log(mywork.workgroups[0].date, mywork.workgroups[0].totalhours);
// show the data for each date
mywork.workgroups.forEach(function(wg, index, thisarray) {
 // console.log(wg.date, wg.totalhours, wg.hours);
});
$(function() {
  mywork.showWork();
});