Búsqueda
Parte de la sección Conceptos básicos de Node.js del Journey de Node.js de Coddy. Lección 32 de 33.
Con unas cuantas decenas de notas, desplazarse por list deja de funcionar: necesitas buscar.
Convierte ambos lados a minúsculas antes de compararlos, para que Milk, milk y MILK coincidan, y luego prueba con includes. Recorre la lista completa y conserva cada índice, para que las coincidencias muestren el mismo número que en list, el que esperan done y remind.
const songs = ['Blue Moon', 'Moonlight', 'Sunny'];
const query = 'MOON'.toLowerCase();
songs.forEach((title, i) => {
if (title.toLowerCase().includes(query)) {
console.log(`${i + 1}. ${title}`);
}
});Desafío
FácilCon muchas notas, desplazarte por list deja de funcionar. Añade un comando search que encuentre notas por una palabra.
- En
notes.js, añade un comandosearch. Las palabras que siguen asearchson lo que se debe buscar. - Encuentra todas las notas que contengan el texto de búsqueda, sin importar las mayúsculas:
milk,MilkyMILKencuentranBuy milk. - Imprime cada coincidencia con
formatNote, usando el número que tiene la nota enlist, para que puedas usar ese número condoneyremind. Imprime primero las coincidencias más antiguas, en el orden en que están almacenadas, incluso cuandosettings.jsonordenalistde más recientes a más antiguas. No imprimas ningún encabezado.
Con las notas Buy milk, Call Ada y buy bread, node notes.js search buy imprime:
1. Buy milk
3. buy breadnode notes.js search ADA imprime 2. Call Ada.
- Cuando ninguna nota coincida, imprime
No notes matchseguido del texto de búsqueda.node notes.js search teaimprime:No notes match tea
Pruébalo: escribe search milk en el cuadro después de $ node notes.js y presiona Enter; luego, search MILK: ambos encuentran las mismas notas. Después, busca una palabra que no aparezca en ninguna de tus notas: verás No notes match y esa palabra.
Pruébalo tú mismo
// Tu herramienta de notas comienza aquí.
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 las lecciones de Conceptos básicos de Node.js
Practica por tu cuenta: Playground de Express