-2
votes

Intervalle de temps de sortie JavaScript

Je travaille pour automatiser une feuille Google sur Google Calendar, mais je suis coincé.

J'ai un tableau de chaînes qui correspondent aux heures p> xxx pré>

et voulez une sortie une chaîne p> xxx pré>

Je dois écrire ceci dans le script d'application Google, toutes les suggestions? P>

Je suis nouveau dans le script de Google App et avoir du mal à écrire la fonction. Mon processus initial était de convertir la gamme de chaînes aux titres militaires et de créer deux boucles, mais je suis sûr qu'il existe un moyen plus efficace de le faire. P>

Merci pour l'aide! P>

Ceci est mon code actuel: p>

p>

var time = [8, 9, 10, 2, 3, 4]

// if (currentTime == 13) {currentTime -= 12;}
function timeRange(cellInput, hourList) {
  var start = parseInt(hourList[0]);
  for (var i = 1; i < hourList.length; ++i) {
    if (hourList[i] == start + i) {
      var end = parseInt(hourList[i]);
    } else {
      cellInput.setValue(start + " - " + (end + 1));
    }
  }
}

function soloTime(cellInput, hour) {
  //convert hour string to hour
  var hour = parseInt(hour)
  var start = hour
  var end = hour + 1
  cellInput.setValue(start + "-" + end);
}


4 commentaires

Partager vos recherches aide tout le monde. Dites-nous ce que vous avez essayé et pourquoi cela n'a pas répondu à vos besoins. Cela démontre que vous avez pris le temps d'essayer de vous aider, cela nous évite de réitérer des réponses évidentes, et surtout, il vous aide à obtenir une réponse plus spécifique et plus pertinente! Voir aussi: Comment demander


Décomposer votre problème. Faites une première passe sur votre matrice pour générer des séquences, puis transformer ces séquences en leur représentation respective à base de cordes. Il sera plus facile de gérer les gammes de 2 éléments de cette façon, si vous voulez 10, 11 au lieu de 10-11.


Carte ou réduire serait des méthodes intéressantes pour enquêter ici


Je vous ai créé un extrait. Veuillez le mettre à jour afin qu'il produit (renvoie) une valeur que vous pouvez consoler.log in a exemple de reproductible minimal


3 Réponses :


0
votes

Vous pouvez vérifier le prédécesseur et collecter les gammes.

p>

var time = [8, 9, 10, 2, 3, 4, 11, 12, 1],
    range = time
        .reduce((r, t, i, a) => {
            if (a[i - 1] % 12 + 1 === t) {
                r[r.length - 1][1] = t;
            } else {
                r.push([t]);
            }
            return r;
        }, [])
        .map(a => a.join('-'))
        .join(', ');

console.log(range);


4 commentaires

Allez, il est assez expliqué.


Au moins c'est sur plusieurs lignes;)))


Merci pour l'entrée! Pouvez-vous expliquer ce que R, T, I et une valeur représentent?


r est l'accumulateur, le résultat temporaire, t est la valeur de l'heure, i l'index de l'élément réel et A est le tableau qui est réellement itéré.



0
votes

Est-ce ce que vous recherchez?

p>

const timeToRange = (arr) => {
  const mins = arr
    .filter((x, i, arr) => x !== arr[i - 1] + 1);
  const maxs = arr
    .filter((x, i, arr) => x !== arr[i + 1] - 1)
    .map(x => x + 1);

  return mins
    .map((x, i) => [x, maxs[i]].join('-'))
    .join(', ');
};

console.log(
  timeToRange([8, 9, 10, 2, 3, 4])
);


1 commentaires

@mplungjan merci! En fait, je ne connaissais pas cette fonctionnalité.



0
votes

Vous pouvez conserver le début de chaque gamme, puis itérer jusqu'à ce que la valeur actuelle ne correspond pas à la précédente, puis prenez la précédente et le début pour créer une plage, les récupérer dans une matrice, et c'est tout.

 const result = [];

 let start = time[0];
 let previous = time[0];

 // Start at the second position, and go over the arrays length by one, so tgat the last range gets added too
 for(const value of time.slice(1).concat(Infinity)) {
   // if the range isn't continuous (12 to 1 is continuous)
   if((value - previous) % 12 !== 1) {
     // Add the previous range, start the new range here
     result.push(start + "-" + previous);
     start = value;
   }
   previous = value;
}

console.log(result.join(", "));


0 commentaires