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"];
5 Réponses :
En supposant que Après cela, vous pouvez simplement boucler sur ce p>
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> objet.entre () code> (par exemple avec
Array.Prototype.map () Code>
) Pour renvoyer les cordes de Format souhaité: p> .as-console-wrapper{min-height:100%;}
@ 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.
Vous pouvez utiliser Réduire A > Pour créer une meilleure structure, comme et votre objet avec les dates comme clé EXEMPLE DE TRAVAIL ICI: P> P> 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é.
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);
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 () code> 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é.
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);
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
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)