Suche
Teil des Abschnitts Node.js-Grundlagen der Node.js-Journey von Coddy. Lektion 32 von 33.
Bei ein paar Dutzend Notizen funktioniert das Durchsuchen von list nicht mehr: Du musst suchen.
Wandle beide Seiten vor dem Vergleichen in Kleinbuchstaben um, damit Milk, milk und MILK alle übereinstimmen, und prüfe dann mit includes. Durchlaufe die gesamte Liste und behalte jeden Index bei, damit ein Treffer dieselbe Nummer wie in list anzeigt, die done und remind erwarten.
const songs = ['Blue Moon', 'Moonlight', 'Sunny'];
const query = 'MOON'.toLowerCase();
songs.forEach((title, i) => {
if (title.toLowerCase().includes(query)) {
console.log(`${i + 1}. ${title}`);
}
});Aufgabe
EinfachBei vielen Notizen funktioniert das Durchblättern mit list nicht mehr. Füge einen Befehl search hinzu, der Notizen anhand eines Wortes findet.
- Füge in
notes.jseinen Befehlsearchhinzu. Die Wörter nachsearchgeben an, wonach gesucht werden soll. - Finde jede Notiz, die den Suchtext enthält, unabhängig von Groß- und Kleinschreibung:
milk,MilkundMILKfinden alleBuy milk. - Gib jeden Treffer mit
formatNoteaus und verwende dabei die Nummer, die die Notiz inlisthat, damit du diese Nummer mitdoneundremindverwenden kannst. Gib die Treffer in der Reihenfolge aus, in der sie gespeichert sind, also die ältesten zuerst – auch wennsettings.jsondie Notizen inlistnach den neuesten zuerst sortiert. Gib keine Überschrift aus.
Bei den Notizen Buy milk, Call Ada und buy bread gibt node notes.js search buy Folgendes aus:
1. Buy milk
3. buy breadnode notes.js search ADA gibt 2. Call Ada aus.
- Wenn keine Notiz passt, gib
No notes matchgefolgt vom Suchtext aus.node notes.js search teagibt Folgendes aus:No notes match tea
Probier es aus: Gib search milk in das Feld nach $ node notes.js ein und drücke die Eingabetaste, dann search MILK: Beide finden dieselben Notizen. Suche anschließend nach einem Wort, das in keiner deiner Notizen vorkommt: Du siehst No notes match und das Wort.
Probier es selbst
// Dein Notiz-Tool beginnt hier.
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);
}
Alle Lektionen in Node.js-Grundlagen
Übe selbstständig: Express-Playground