web-dev-qa-db-ja.com

"!duplicateNote.length"が機能しないのはなぜですか?

Yargsを使用して、コマンドラインからアクセスするメモを取るアプリを作成しています。新しいタイトルを入力すると、重複を避けるために、入力したようなタイトルが存在しないことを確認する必要があります。したがって、重複がない場合、内部には何もないため、理論的には!duplicateNote.lengthと評価されます。

ただし、未定義のオブジェクトが原因で、アプリケーションが機能しなくなりました。そして、私はそれを理解することができません。すべてが正しく要求されています。

APP.JSファイル

yargs.command({
    command: 'add',
    describe: 'Add a new note',
    builder: {
        title: {
            describe: 'Note title',
            demandOption: true,
            type: 'string'
        }, 
        body: {
            describe: 'Note body',
            demandOption: true,
            type: 'string'
        }
    },
    handler(argv) {
        notes.addNote(argv.title, argv.body)
    }
})  

NOTES.JSファイル

const addNote = (title, body) => {
    const notes = loadNotes()
    const duplicateNote = notes.find((note) => note.title === title)

    if (!duplicateNote.length) {
        notes.Push({
            title: title,
            body: body
        })
        saveNotes(notes)
        console.log(chalk.green.inverse('New note added!'))
    } else {
        console.log(chalk.bgRed('Note title taken!'))
    }
}

const loadNotes= () => {
    try {
        const dataBuffer = fs.readFileSync('notes.json')
        const dataJSON = dataBuffer.toString()
        return JSON.parse(dataJSON)
    } catch (e) {
        return[]
    }

}

module.exports = {
    addNote:    addNote,
    removeNote: removeNote,
    listNotes:  listNotes,
    readNote:   readNote
}

「新しいメモが追加されました!」コンソールに記録されるが、代わりに:TypeError: Cannot read property 'length' of undefined

2
Michael

findに何もない場合、undefinedを取得するためです。確認したい場合はfilterを使用してください。

const duplicateNote = notes.filter((note) => note.title === title)

filterは常に配列を提供します-findundefined、または検出されたデータ型のいずれかを提供します。

0
Jack Bashford