Menu
CoddyTech

חיפוש

חלק מהיחידה יסודות 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}`);
    }
});
challenge icon

אתגר

קל

כשיש הרבה פתקים, גלילה באמצעות list מפסיקה לעבוד. הוסיפו פקודת search שמוצאת פתקים לפי מילה.

  1. ב־notes.js, הוסיפו פקודת search. המילים שאחרי search הן המילים שיש לחפש.
  2. מצאו כל פתק שמכיל את טקסט החיפוש, בלי קשר לאותיות גדולות או קטנות: milk, Milk ו־MILK מוצאים כולם את Buy milk.
  3. הדפיסו כל התאמה באמצעות 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.

  1. כשאין התאמה לאף פתק, הדפיסו 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

תרגלו בעצמכם: Express אונליין