Menu
CoddyTech

Pencarian

Termasuk bagian Dasar-Dasar Node.js dalam perjalanan Node.js di Coddy. Pelajaran 32 dari 33.

Dengan beberapa lusin catatan, menggulir list tidak lagi efektif: kamu perlu mencari.

Ubah kedua sisi menjadi huruf kecil sebelum membandingkannya, agar Milk, milk, dan MILK semuanya cocok, lalu uji dengan includes. Lakukan perulangan pada seluruh list dan simpan setiap indeks, agar hasil yang cocok menampilkan nomor yang sama seperti di list, nomor yang diharapkan oleh done dan 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

Tantangan

Mudah

Jika catatanmu banyak, menggulir list tidak lagi praktis. Tambahkan perintah search untuk mencari catatan berdasarkan kata.

  1. Di notes.js, tambahkan perintah search. Kata-kata setelah search adalah kata yang akan dicari.
  2. Cari setiap catatan yang memuat teks pencarian, tanpa membedakan huruf besar dan kecil: milk, Milk, dan MILK semuanya menemukan Buy milk.
  3. Cetak setiap hasil yang cocok dengan formatNote, menggunakan nomor catatan yang ditampilkan di list, agar kamu bisa menggunakan nomor itu dengan done dan remind. Cetak hasil yang cocok dari yang paling lama, sesuai urutan penyimpanannya, meskipun settings.json mengurutkan list dari yang terbaru terlebih dahulu. Jangan cetak judul.

Dengan catatan Buy milk, Call Ada, dan buy bread, node notes.js search buy mencetak:

1. Buy milk
3. buy bread

node notes.js search ADA mencetak 2. Call Ada.

  1. Jika tidak ada catatan yang cocok, cetak No notes match diikuti teks pencarian. node notes.js search tea mencetak:
    No notes match tea

Coba: ketik search milk di kotak setelah $ node notes.js lalu tekan Enter, kemudian ketik search MILK: keduanya menemukan catatan yang sama. Lalu cari kata yang tidak ada di catatanmu: kamu akan melihat No notes match dan kata tersebut.

Coba sendiri

// Alat pencatatmu dimulai di sini.
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);
}

Semua pelajaran di Dasar-Dasar Node.js

Latihan sendiri: Playground Express