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. أضف أمر search في notes.js. الكلمات التي تأتي بعد 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

تدرّب بنفسك: Playground لـ Express