Menu
CoddyTech

Tìm kiếm

Thuộc phần Kiến thức cơ bản về Node.js trong hành trình Node.js của Coddy. Bài học 32 trên 33.

Khi có vài chục ghi chú, cuộn qua list sẽ không còn hiệu quả: bạn cần tìm kiếm.

Chuyển cả hai phía về chữ thường trước khi so sánh để Milk, milk và MILK đều khớp, rồi kiểm tra bằng includes. Lặp qua toàn bộ danh sách và giữ lại từng chỉ số, để kết quả khớp hiển thị cùng số như trong list, đúng số mà done và remind cần.

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

Thử thách

Dễ

Khi có nhiều ghi chú, cuộn qua list sẽ không còn hiệu quả. Thêm lệnh search để tìm ghi chú theo từ.

  1. Trong notes.js, hãy thêm lệnh search. Các từ sau search là nội dung cần tìm.
  2. Tìm mọi ghi chú có chứa nội dung tìm kiếm, không phân biệt chữ hoa chữ thường: milk, Milk và MILK đều tìm thấy Buy milk.
  3. In từng kết quả khớp bằng formatNote, dùng số thứ tự của ghi chú trong list để bạn có thể dùng số đó với done và remind. In các kết quả theo thứ tự từ cũ nhất đến mới nhất, theo thứ tự chúng được lưu, ngay cả khi settings.json sắp xếp list theo thứ tự mới nhất trước. Không in tiêu đề.

Với các ghi chú Buy milk, Call Ada và buy bread, node notes.js search buy sẽ in:

1. Buy milk
3. buy bread

node notes.js search ADA sẽ in 2. Call Ada.

  1. Khi không có ghi chú nào khớp, hãy in No notes match rồi đến nội dung tìm kiếm. node notes.js search tea sẽ in:
    No notes match tea

Thử nhé: nhập search milk vào ô sau $ node notes.js rồi nhấn Enter, sau đó nhập search MILK: cả hai đều tìm thấy cùng các ghi chú. Tiếp theo, tìm một từ không có trong ghi chú nào của bạn: bạn sẽ thấy No notes match và từ đó.

Tự làm thử

// Công cụ ghi chú của bạn bắt đầu từ đây.
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);
}

Tất cả bài học trong Kiến thức cơ bản về Node.js

Tự luyện tập: Playground Express