Как вычесть четные позиции из нечетных в 2D массиве и отобразить новый массив с результатами? - PullRequest
1 голос
/ 19 января 2020

У меня есть многомерный массив, первая позиция которого - объект Date (). Ранее я сократил расположение, группируя его по дням. Я пытаюсь уменьшить каждый суточный под-массив с результатами вычитания нечетных позиций ("SALIDA") пар ("ENTRADA").

Это данные:

const arrayHoras = [
  [
    "Thu Jan 02 2020 08:25:38 GMT+0100 (CET)",
    "ENTRADA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Thu Jan 02 2020 13:30:43 GMT+0100 (CET)",
    "SALIDA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Thu Jan 02 2020 15:18:06 GMT+0100 (CET)",
    "ENTRADA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Thu Jan 02 2020 18:12:22 GMT+0100 (CET)",
    "SALIDA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Fri Jan 03 2020 08:35:38 GMT+0100 (CET)",
    "ENTRADA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Fri Jan 03 2020 10:15:23 GMT+0100 (CET)",
    "SALIDA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Fri Jan 03 2020 10:59:16 GMT+0100 (CET)",
    "ENTRADA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Fri Jan 03 2020 12:25:01 GMT+0100 (CET)",
    "SALIDA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Fri Jan 03 2020 12:31:33 GMT+0100 (CET)",
    "ENTRADA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Fri Jan 03 2020 13:20:43 GMT+0100 (CET)",
    "SALIDA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Fri Jan 03 2020 15:28:06 GMT+0100 (CET)",
    "ENTRADA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Fri Jan 03 2020 18:32:10 GMT+0100 (CET)",
    "SALIDA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Tue Jan 07 2020 08:31:46 GMT+0100 (CET)",
    "ENTRADA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Tue Jan 07 2020 13:22:51 GMT+0100 (CET)",
    "SALIDA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Tue Jan 07 2020 15:30:00 GMT+0100 (CET)",
    "ENTRADA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Tue Jan 07 2020 17:22:29 GMT+0100 (CET)",
    "SALIDA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Tue Jan 07 2020 17:31:59 GMT+0100 (CET)",
    "ENTRADA",
    "NOMBRE APELLIDO APELLIDO"
  ],
  [
    "Tue Jan 07 2020 18:32:30 GMT+0100 (CET)",
    "SALIDA",
    "NOMBRE APELLIDO APELLIDO"
  ]
];

Первый шаг : мы группируем 2D-схему по дням первой позиции каждого элемента

const gruposDias = arrayHoras.reduce((acumulador, valorActual) => {
  const dia = new Date(valorActual[0]).getDate();
  if (!acumulador[dia]) {
    acumulador[dia] = [];
  }
  acumulador[dia].push(valorActual);
  return acumulador;
}, []);

const agrupadosPorDia = Object.keys(gruposDias).map(porDia => {
  return gruposDias[porDia];
});

Второй шаг : I попытайтесь уменьшить сгруппированные по дням меры, вычитая секунды, прошедшие между датами нечетных позиций ("SALIDA") и четных ("ENTRADA"):

const entradas = [];
const salidas = [];
for (let i = 0; i < agrupadosPorDia.length; i += 1) {
  const agrupadosPorDiaI = agrupadosPorDia[i];
  for (let j = 0; j < agrupadosPorDiaI.length; j += 1) {
    if (j % 2) {
      const salidaTime = new Date(agrupadosPorDia[i][j][0]).getTime();
      salidas.push(salidaTime);
      rowSalida.push((ultRowConDatoSimulado += 2));
    } else {
      const entradaTime = new Date(agrupadosPorDia[i][j][0]).getTime();
      entradas.push(entradaTime);
    }
  }
}
console.log("entradas: ", entradas);
console.log("salidas: ", salidas);

Моя проблема : со вторым шагом я теряю возвращенные массивы "entradas" и "salidas" в каждом подмассиве 2D-массива, сгруппированного по дням.

Есть ли у кого-нибудь доброта к пролить свет на мою работу с декодером?.

И, злоупотребляя своими знаниями, можете ли вы избежать второго шага, расширив массив двумерного массива, увеличивая методы limit () и map () ?. Я пробовал все, я думаю.

Обновление

Ожидаемый результат

agrupadosPorDia: [
  [ 
    [ "05:05:05" ],
    [ "02:54:16" ]
  ],
  [
    [ "02:54:16" ],
    [ "01:39:45" ],
    [ "01:25:45" ],
    [ "00:49:10" ],
    [ "03:04:04" ]
  ],
  ​​[
    [ "04:51:05" ],
    [ "01:52:29" ],
    [ "01:00:31" ],
  ]
];

1 Ответ

0 голосов
/ 19 января 2020

В качестве одного прохода вы можете предположить, что два последовательных horas совершают вызов.

Затем вы отображаете каждый вызов как <diff, date> и итеративно (как и вы) группируете вызовы по дате

Поскольку вас не интересует звонок, а просто время, которое потребовалось (а именно diff), вы группируете разницу по дате

const arrayHoras = [["Thu Jan 02 2020 08:25:38 GMT+0100 (CET)","ENTRADA","NOMBRE APELLIDO APELLIDO"],["Thu Jan 02 2020 13:30:43 GMT+0100 (CET)","SALIDA","NOMBRE APELLIDO APELLIDO"],["Thu Jan 02 2020 15:18:06 GMT+0100 (CET)","ENTRADA","NOMBRE APELLIDO APELLIDO"],["Thu Jan 02 2020 18:12:22 GMT+0100 (CET)","SALIDA","NOMBRE APELLIDO APELLIDO"],["Fri Jan 03 2020 08:35:38 GMT+0100 (CET)","ENTRADA","NOMBRE APELLIDO APELLIDO"],["Fri Jan 03 2020 10:15:23 GMT+0100 (CET)","SALIDA","NOMBRE APELLIDO APELLIDO"],["Fri Jan 03 2020 10:59:16 GMT+0100 (CET)","ENTRADA","NOMBRE APELLIDO APELLIDO"],["Fri Jan 03 2020 12:25:01 GMT+0100 (CET)","SALIDA","NOMBRE APELLIDO APELLIDO"],["Fri Jan 03 2020 12:31:33 GMT+0100 (CET)","ENTRADA","NOMBRE APELLIDO APELLIDO"],["Fri Jan 03 2020 13:20:43 GMT+0100 (CET)","SALIDA","NOMBRE APELLIDO APELLIDO"],["Fri Jan 03 2020 15:28:06 GMT+0100 (CET)","ENTRADA","NOMBRE APELLIDO APELLIDO"],["Fri Jan 03 2020 18:32:10 GMT+0100 (CET)","SALIDA","NOMBRE APELLIDO APELLIDO"],["Tue Jan 07 2020 08:31:46 GMT+0100 (CET)","ENTRADA","NOMBRE APELLIDO APELLIDO"],["Tue Jan 07 2020 13:22:51 GMT+0100 (CET)","SALIDA","NOMBRE APELLIDO APELLIDO"],["Tue Jan 07 2020 15:30:00 GMT+0100 (CET)","ENTRADA","NOMBRE APELLIDO APELLIDO"],["Tue Jan 07 2020 17:22:29 GMT+0100 (CET)","SALIDA","NOMBRE APELLIDO APELLIDO"],["Tue Jan 07 2020 17:31:59 GMT+0100 (CET)","ENTRADA","NOMBRE APELLIDO APELLIDO"],["Tue Jan 07 2020 18:32:30 GMT+0100 (CET)","SALIDA","NOMBRE APELLIDO APELLIDO"]]

// huge probability of being incorrect, use moment or something
const makeDelta = (a,b) => {
  const d = new Date(b - a)
  return [d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds()]
    .map(x => (x+'').padStart(2, '0'))
    .join(':')
}

const res = arrayHoras.reduce(({ dateToCalls, call }, h)=>{
  call.push(h)
  if (call.length == 2) {
    const [a, b] = call.map(x => new Date(x[0]))
    const date = a.getDate()
    const v = dateToCalls.get(date) || []
    v.push(makeDelta(a,b))
    dateToCalls.set(date, v)
    call = []
  }
  return { dateToCalls, call }
}, { dateToCalls: new Map(), call: []}).dateToCalls.values()

//res is an iterator, get an array
const out = [...res]
console.log(out)
...