Menu
CoddyTech

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

Défi

Facile

Quand tu as beaucoup de notes, faire défiler list ne fonctionne plus. Ajoute une commande search qui trouve les notes contenant un mot.

  1. Dans notes.js, ajoute une commande search. Les mots qui suivent search sont ceux que tu veux rechercher.
  2. Trouve chaque note contenant le texte recherché, quelle que soit la casse : milk, Milk et MILK trouvent tous Buy milk.
  3. Affiche chaque correspondance avec formatNote, en utilisant le numéro de la note dans list, afin de pouvoir utiliser ce numéro avec done et remind. Affiche les correspondances de la plus ancienne à la plus récente, dans l’ordre où elles sont stockées, même lorsque settings.json trie list de 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 bread

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

  1. Lorsqu’aucune note ne correspond, affiche No notes match suivi du texte recherché. node notes.js search tea affiche :
    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

Entraînez-vous par vous-même : Playground Express