חיפוש
חלק מהיחידה יסודות Node.js במסלול ה-Node.js של Coddy. שיעור 32 מתוך 33.
עם כמה עשרות פתקים, גלילה ברשימת list כבר לא עובדת: צריך לחפש.
המירו את שני הצדדים לאותיות קטנות לפני ההשוואה, כך ש-Milk, milk ו-MILK יתאימו כולם, ואז בדקו באמצעות includes. עברו בלולאה על הרשימה המלאה ושמרו כל אינדקס, כדי שהתאמה תציג את אותו מספר כמו ב-list, המספר ש-done ו-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}`);
}
});אתגר
קלכשיש הרבה פתקים, גלילה באמצעות list מפסיקה לעבוד. הוסיפו פקודת search שמוצאת פתקים לפי מילה.
- ב־
notes.js, הוסיפו פקודתsearch. המילים שאחריsearchהן המילים שיש לחפש. - מצאו כל פתק שמכיל את טקסט החיפוש, בלי קשר לאותיות גדולות או קטנות:
milk,Milkו־MILKמוצאים כולם אתBuy milk. - הדפיסו כל התאמה באמצעות
formatNote, תוך שימוש במספר של הפתק כפי שהוא מופיע ב־list, כדי שתוכלו להשתמש במספר הזה עםdoneועםremind. הדפיסו את ההתאמות מהוותיקה לחדשה, לפי סדר האחסון שלהן, גם כאשרsettings.jsonממיין אתlistמהחדשה לוותיקה. אל תדפיסו כותרת.
עם הפתקים Buy milk, Call Ada ו־buy bread, הפקודה node notes.js search buy מדפיסה:
1. Buy milk
3. buy breadהפקודה node notes.js search ADA מדפיסה 2. Call Ada.
- כשאין התאמה לאף פתק, הדפיסו
No notes matchואחריו את טקסט החיפוש. הפקודהnode notes.js search teaמדפיסה:No notes match tea
נסו זאת: הקלידו search milk בתיבה שאחרי $ node notes.js ולחצו על Enter, ואז הקלידו search MILK: שתי הפקודות מוצאות את אותם הפתקים. לאחר מכן חפשו מילה שאינה מופיעה באף אחד מהפתקים שלכם: תראו את No notes match ואת המילה הזאת.
נסו בעצמכם
// כלי ההערות שלך מתחיל כאן.
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);
}
כל השיעורים ביחידה יסודות Node.js
1הרצת JavaScript ב-Node
שלום, Nodeקריאת הפקודהארגומנטים של שורת הפקודהפקודותתרגלו בעצמכם: Express אונליין