Menu
CoddyTech

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}`);
    }
});
challenge icon

Aufgabe

Einfach

Bei vielen Notizen funktioniert das Durchblättern mit list nicht mehr. Füge einen Befehl search hinzu, der Notizen anhand eines Wortes findet.

  1. Füge in notes.js einen Befehl search hinzu. Die Wörter nach search geben an, wonach gesucht werden soll.
  2. Finde jede Notiz, die den Suchtext enthält, unabhängig von Groß- und Kleinschreibung: milk, Milk und MILK finden alle Buy milk.
  3. Gib jeden Treffer mit formatNote aus und verwende dabei die Nummer, die die Notiz in list hat, damit du diese Nummer mit done und remind verwenden kannst. Gib die Treffer in der Reihenfolge aus, in der sie gespeichert sind, also die ältesten zuerst – auch wenn settings.json die Notizen in list nach 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 bread

node notes.js search ADA gibt 2. Call Ada aus.

  1. Wenn keine Notiz passt, gib No notes match gefolgt vom Suchtext aus. node notes.js search tea gibt 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