Menu
CoddyTech

Ricerca

Fa parte della sezione Fondamenti di Node.js del percorso Node.js di Coddy. Lezione 32 di 33.

Con qualche decina di note, scorrere list smette di funzionare: devi cercare.

Converti entrambe le parti in minuscolo prima di confrontarle, così Milk, milk e MILK corrispondono tutte, poi verifica con includes. Scorri l'intero elenco e conserva ogni indice, così una corrispondenza mostra lo stesso numero che ha in list, quello che done e remind si aspettano.

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

Sfida

Facile

Con molte note, scorrere l'elenco con list smette di funzionare. Aggiungi un comando search che trovi le note in base a una parola.

  1. In notes.js, aggiungi un comando search. Le parole dopo search indicano cosa cercare.
  2. Trova ogni nota che contiene il testo cercato, indipendentemente dalle maiuscole: milk, Milk e MILK trovano tutte Buy milk.
  3. Stampa ogni corrispondenza con formatNote, usando il numero che la nota ha nell'elenco list, così puoi usare quel numero con done e remind. Stampa le corrispondenze dalla più vecchia alla più recente, nell'ordine in cui sono memorizzate, anche quando settings.json ordina list dalla più recente alla più vecchia. Non stampare un'intestazione.

Con le note Buy milk, Call Ada e buy bread, node notes.js search buy stampa:

1. Buy milk
3. buy bread

node notes.js search ADA stampa 2. Call Ada.

  1. Quando nessuna nota corrisponde, stampa No notes match seguito dal testo cercato. node notes.js search tea stampa:
    No notes match tea

Prova: digita search milk nella casella dopo $ node notes.js e premi Invio, poi search MILK: entrambi trovano le stesse note. Poi cerca una parola che non compare in nessuna delle tue note: vedrai No notes match e quella parola.

Provalo tu

// Il tuo strumento per gli appunti inizia qui.
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);
}

Tutte le lezioni di Fondamenti di Node.js

Esercitati da solo: Playground Express