Menu
CoddyTech

Pesquisa

Parte da seção Fundamentos de Node.js do Journey de Node.js da Coddy. Lição 32 de 33.

Com algumas dezenas de notas, percorrer list deixa de funcionar: você precisa pesquisar.

Converta os dois lados para minúsculas antes de comparar, assim Milk, milk e MILK correspondem; depois, teste com includes. Percorra a lista inteira e mantenha cada índice, para que uma correspondência exiba o mesmo número que em list, aquele que done e remind esperam.

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

Desafio

Fácil

Com muitas anotações, percorrer list deixa de funcionar. Adicione um comando search que encontre anotações por uma palavra.

  1. Em notes.js, adicione um comando search. As palavras depois de search são o que você deve procurar.
  2. Encontre todas as anotações que contenham o texto de busca, independentemente de maiúsculas e minúsculas: milk, Milk e MILK encontram Buy milk.
  3. Exiba cada correspondência com formatNote, usando o número que a anotação tem em list, para que você possa usar esse número com done e remind. Exiba as correspondências da mais antiga para a mais recente, na ordem em que estão armazenadas, mesmo quando settings.json ordena list da mais recente para a mais antiga. Não exiba um título.

Com as anotações Buy milk, Call Ada e buy bread, node notes.js search buy exibe:

1. Buy milk
3. buy bread

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

  1. Quando nenhuma anotação corresponder, exiba No notes match seguido do texto de busca. node notes.js search tea exibe:
    No notes match tea

Experimente: digite search milk na caixa depois de $ node notes.js e pressione Enter; em seguida, digite search MILK: ambos encontram as mesmas anotações. Depois, pesquise uma palavra que não esteja em nenhuma das suas anotações: você verá No notes match e essa palavra.

Experimente você mesmo

// Sua ferramenta de anotações começa aqui.
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);
}

Todas as lições de Fundamentos de Node.js

Pratique por conta própria: Playground de Express