Recherche
Fait partie de la section Les bases de Node.js du Journey Node.js de Coddy. Leçon 32 sur 33.
Avec quelques dizaines de notes, faire défiler list ne suffit plus : il faut effectuer une recherche.
Convertis les deux côtés en minuscules avant de les comparer, afin que Lait, lait et LAIT correspondent tous, puis teste avec includes. Parcours toute la liste et conserve chaque index, afin qu’une correspondance affiche le même numéro que dans list, celui que done et remind attendent.
const songs = ['Blue Moon', 'Moonlight', 'Sunny'];
const query = 'MOON'.toLowerCase();
songs.forEach((title, i) => {
if (title.toLowerCase().includes(query)) {
console.log(`${i + 1}. ${title}`);
}
});Défi
FacileQuand tu as beaucoup de notes, faire défiler list ne fonctionne plus. Ajoute une commande search qui trouve les notes contenant un mot.
- Dans
notes.js, ajoute une commandesearch. Les mots qui suiventsearchsont ceux que tu veux rechercher. - Trouve chaque note contenant le texte recherché, quelle que soit la casse :
milk,MilketMILKtrouvent tousBuy milk. - Affiche chaque correspondance avec
formatNote, en utilisant le numéro de la note danslist, afin de pouvoir utiliser ce numéro avecdoneetremind. Affiche les correspondances de la plus ancienne à la plus récente, dans l’ordre où elles sont stockées, même lorsquesettings.jsontrielistde la plus récente à la plus ancienne. N’affiche aucun titre.
Avec les notes Buy milk, Call Ada et buy bread, node notes.js search buy affiche :
1. Buy milk
3. buy breadnode notes.js search ADA affiche 2. Call Ada.
- Lorsqu’aucune note ne correspond, affiche
No notes matchsuivi du texte recherché.node notes.js search teaaffiche :No notes match tea
Essaie : saisis search milk dans la zone après $ node notes.js, puis appuie sur Entrée, et saisis ensuite search MILK : les deux recherches trouvent les mêmes notes. Recherche ensuite un mot qui ne figure dans aucune de tes notes : tu verras No notes match, suivi de ce mot.
Essayez vous-même
// Votre outil de prise de notes commence ici.
import { rmSync } from 'node:fs';
import path from 'node:path';
import { formatNote } from './format.js';
import stats from './legacy/stats.cjs';
import pkg from './package.json' with { type: 'json' };
import store from './store.js';
const [command, ...words] = process.argv.slice(2);
const text = words.join(' ');
store.on('added', (note, n) => {
console.log(`Saved note ${n}.`);
});
const noteNumber = (word) => {
const n = Number(word);
if (!Number.isInteger(n) || n < 1 || n > store.notes.length) {
console.error(`No note ${word}`);
process.exit(1);
}
return n;
};
if (command === 'add') {
await store.add(text);
} else if (command === 'list') {
const owner = process.env.NOTES_OWNER ?? 'you';
console.log(`Notes for ${owner}`);
if (store.notes.length === 0) {
console.log('No notes yet');
}
const lines = store.notes.map((note, i) => formatNote(i + 1, note));
if (store.settings.sort === 'newest') {
lines.reverse();
}
lines.forEach((line) => console.log(line));
} else if (command === 'where') {
const file = path.join(process.cwd(), 'notes.json');
console.log(file);
console.log(path.basename(file));
} else if (command === 'stats') {
console.log(`${store.notes.length} notes, ${stats.countWords(store.notes)} words`);
} else if (command === 'done') {
const removed = await store.remove(noteNumber(words[0]));
console.log(`Done: ${removed}`);
} else if (command === 'remind') {
const note = store.notes[noteNumber(words[0]) - 1];
let count = 3;
const timer = setInterval(() => {
if (count > 0) {
console.log(count);
count -= 1;
} else {
console.log(note);
clearInterval(timer);
}
}, 200);
} else if (command === 'import') {
let input = '';
for await (const chunk of process.stdin) {
input += chunk;
}
const lines = input
.split('\n')
.map((line) => line.trim())
.filter((line) => line !== '');
for (const line of lines) {
await store.add(line);
}
console.log(`Imported ${lines.length} notes.`);
} else if (command === 'version') {
console.log(`${pkg.name} ${pkg.version}`);
} else if (command === 'clear') {
rmSync('notes.json', { force: true });
console.log('Deleted notes.json');
} else {
if (command) {
console.error(`Unknown command: ${command}`);
}
console.error('Usage: node notes.js <command> [words]');
process.exit(1);
}
Toutes les leçons de Les bases de Node.js
1Exécuter JavaScript avec Node
Bonjour, NodeLire la commandeArguments de ligne de commandeCommandes5Événements, entrées et packages
Écouter avant d’émettreÉmetteurs d’événementsLire les entréesEntraînez-vous par vous-même : Playground Express