Menu
CoddyTech

검색

Coddy Node.js 여정의 Node.js 기초 섹션에 포함된 레슨. 33개 중 32번째.

메모가 수십 개쯤 되면 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

직접 해보기: $ node notes.js 뒤의 입력란에 search milk를 입력하고 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 플레이그라운드