-1
votes

GROUPE DE SEMAINE DE LA SEMAINE DANS LES HÈVES COMMUNES OUVERTES

J'ai deux tableaux jours code> et opentime code>, comment puis-je regrouper les jours basés sur le même temps ouvert.

var output = ["Monday Wednesday Thursday 09:30-10:30", "Tuesday Friday Saturday 08:30-12:30", "Sunday 12:00-16:00"];


0 commentaires

5 Réponses :


1
votes

solution compacte et efficace

note forte> em> em>: solution acceptée utilise Anti-motif (Screen Syntaxe) pour ajouter l'élément à une matrice, qui Provoque une nouvelle création de tableau sur chaque itération de la boucle. C'est le le plus lent parmi les approches disponibles. Em> p>


En supposant que opentime code> index correspondre aux éléments respectifs de jours code>, vous pouvez traverser opentime code> avec Array.Prototype.reduce () Code> Pour construire un objet où les clés vont Match Open Horties et valeurs (tableaux d'index) représentera des jours de semaine respectifs. P>

Après cela, vous pouvez simplement boucler sur ce objet.entre () code> (par exemple avec Array.Prototype.map () Code> ) Pour renvoyer les cordes de Format souhaité: p>

p>

.as-console-wrapper{min-height:100%;}


1 commentaires

@ Yevgen-Gorbunkov merci pour la réponse rapide. Le seul commentaire est que votre code n'a aucun commentaire, cela en rend un peu plus difficile à comprendre.



0
votes

Vous pouvez utiliser Réduire A > Pour créer une meilleure structure, comme et votre objet avec les dates comme clé code> .... alors vous pouvez utiliser Object.entries Pour obtenir chaque entrée de votre nouvel objet en tant que tableau avec la forme de [clé, valeur] code> et ensuite faire la jointure pour créer le mot souhaité.

EXEMPLE DE TRAVAIL ICI: P>

P>

var Days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
var OpenTime = ["09:30-10:30", "08:30-12:30", "09:30-10:30", "09:30-10:30", "08:30-12:30", "08:30-12:30", "12:00-16:00"];

reducer = (accum, cv, index) => {
  // if the date doesnt have an entry, we create a new one
  if (!accum[cv]) {
    accum[cv] = []
  }

  // create an array with the previous values and the new one
  // in the first iteration it will be always => [ ...[], value]
  // but if the key matches a previous array it will be => [...[prevVal], value]
  accum[cv] = [...accum[cv], Days[index]];

  return accum;


}

const reduced = OpenTime.reduce(reducer, {});

const finalResult = Object.entries(reduced).map(([date, days]) => {
  return days.join(' ') + ' ' + date;
})

console.log(finalResult);


2 commentaires

Je sais que la nature des données source implique que le nombre d'entrées est limité, la performance peut donc ne pas être un problème. Toutefois, le modèle d'utilisation de la syntaxe de diffusion pour ajouter des éléments au tableau dans .ReRuce () est plutôt controversé car il oblige la création d'une nouvelle matrice à chaque itération. C'est pourquoi, je suppose que, il est logique de préférer une autre Méthode plus rapide .


Totalement d'accord @yevgengerbunkov, mais l'utilisateur n'a jamais demandé une performance, je n'essayais donc pas de le faire comme ça, je viens de mettre la première idée dans mon esprit, mais merci à votre correction, c'est vraiment apprécié.



0
votes

let Days = ["Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
let OpenTime = ["09:30-10:30", "08:30-12:30", "09:30-10:30", "09:30-10:30", "08:30-12:30", "08:30-12:30", "12:00-16:00"];   

let transformed = OpenTime.reduce((result,ot,index,original)=>{
  let ti = result.findIndex(r=>r.time===ot);
  ti===-1 ? result.push({time:ot, days: [Days[index]]}) :result[ti].days.push(Days[index]);
  return result;
},[]).map(item=>(`${item.days.join(" ")} ${item.time}`));

console.log(transformed);


0 commentaires

0
votes

const Days = ["Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
const OpenTime = ["09:30-10:30", "08:30-12:30", "09:30-10:30", "09:30-10:30", "08:30-12:30", "08:30-12:30", "12:00-16:00"];

checkDuplicateEntries = (array) => {
  const duplicates = {};
  for (let i = 0; i < array.length; i++) {
    if (duplicates.hasOwnProperty(array[i])) {
      duplicates[array[i]].push(i);
    } else if (array.lastIndexOf(array[i]) !== i) {
      duplicates[array[i]] = [i];
    }
  }
   return getPairedArray(duplicates);
}

getPairedArray = (obj) => {
    const pairedArray = [];
    for(const key in obj) {
        let timings = '';
        for(const index of obj[key]){
            timings += ` ${Days[index]}`;
        }
        timings += ` ${key}`;
        pairedArray.push(timings);
    }
    return pairedArray;
} 

console.log(checkDuplicateEntries(OpenTime));


// Hope this will help


0 commentaires

0
votes

Utiliser ES6 et en supposant que la structure de données pour la cartographie de la journée ne peut être modifiée. Ensuite:

p>

const Days = ["Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];

const OpenTime = ["09:30-10:30", "08:30-12:30", "09:30-10:30", "09:30-10:30", "08:30-12:30", "08:30-12:30", "12:00-16:00"];

// get all the common open time and merge in a smaller array
const uniqueOpenTimes = OpenTime.reduce((uniqueTimes, time) => !uniqueTimes.includes(time)? [...uniqueTimes, time] : uniqueTimes, []);


// Now do the nested loop successfully assuming that both arrays grow equally i.e. OpenTime and Days
const uniqueOpenTimesWithDay = uniqueOpenTimes.reduce((strArr, time) => {
  let daysStrings = "";
  Days.forEach((day, i) => {
    if (OpenTime[i] === time){
      daysStrings += `${day} `;
    }
  });
  daysStrings += time;
  strArr.push(daysStrings.trim())
  return strArr;
}, []);

console.log('uniqueOpenTimesWithDay', uniqueOpenTimesWithDay)


0 commentaires