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}`);
}
});Sfida
FacileCon molte note, scorrere l'elenco con list smette di funzionare. Aggiungi un comando search che trovi le note in base a una parola.
- In
notes.js, aggiungi un comandosearch. Le parole doposearchindicano cosa cercare. - Trova ogni nota che contiene il testo cercato, indipendentemente dalle maiuscole:
milk,MilkeMILKtrovano tutteBuy milk. - Stampa ogni corrispondenza con
formatNote, usando il numero che la nota ha nell'elencolist, così puoi usare quel numero condoneeremind. Stampa le corrispondenze dalla più vecchia alla più recente, nell'ordine in cui sono memorizzate, anche quandosettings.jsonordinalistdalla 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 breadnode notes.js search ADA stampa 2. Call Ada.
- Quando nessuna nota corrisponde, stampa
No notes matchseguito dal testo cercato.node notes.js search teastampa: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