如何检查字符串到对象数组的Map中是否存在对象内指定值,实现不存在则添加书籍并解决访问索引('Horror')的问题?
嘿,我来帮你搞定这个问题!首先得揪出你代码里的一个小语法错误——你现在写的bookMap写法不对哦:如果是普通对象,键值对得用冒号:而不是=>;如果是想用ES6的Map,那整个定义方式都不一样。我分两种常用的情况给你拆解:
情况1:使用普通对象(Object)
这是最常见的写法,先给你纠正后的bookMap定义:
const bookMap = { 'Horror': [{ id: 9798721052927, title: 'Dracula', author: 'Bram Stoker' }], 'Romance': [{ id: 9798721052927, title: 'Love Story', author: 'Bram Stoker' }] };
检查是否包含指定书籍
要检查某个分类下是否存在目标书籍,用some方法比filter更高效(some找到匹配项就会停止遍历,而filter会返回所有匹配的数组),再搭配可选链?.避免分类不存在时报错:
const targetGenre = 'Horror'; const targetTitle = 'Dracula'; // 检查Horror分类里是否有标题为Dracula的书 const hasTargetBook = bookMap[targetGenre]?.some(book => book.title === targetTitle); console.log(hasTargetBook); // 输出true
实现「不存在则添加」的功能
还要考虑如果分类本身不存在的情况,先初始化空数组,再用书籍id判断是否重复(用id比title更准确,毕竟可能有同名书):
function addBookIfNotExists(bookMap, genre, newBook) { // 如果分类不存在,先创建空数组 if (!bookMap[genre]) { bookMap[genre] = []; } // 检查书籍是否已存在 const bookExists = bookMap[genre].some(book => book.id === newBook.id); if (!bookExists) { bookMap[genre].push(newBook); console.log(`已添加书籍《${newBook.title}》到${genre}分类`); } else { console.log(`《${newBook.title}》已经在${genre}分类里啦`); } } // 示例调用:添加一本新的恐怖小说 addBookIfNotExists(bookMap, 'Horror', { id: 123456, title: 'Frankenstein', author: 'Mary Shelley' });
情况2:使用ES6 Map
如果你确实想使用Map(它的键可以是任意类型,比对象更灵活),那正确的定义是这样的:
const bookMap = new Map([ ['Horror', [{ id: 9798721052927, title: 'Dracula', author: 'Bram Stoker' }]], ['Romance', [{ id: 9798721052927, title: 'Love Story', author: 'Bram Stoker' }]] ]);
检查是否包含指定书籍
Map用get()方法获取对应键的值,同样用some判断:
const targetGenre = 'Horror'; const targetTitle = 'Dracula'; const genreBooks = bookMap.get(targetGenre); const hasTargetBook = genreBooks ? genreBooks.some(book => book.title === targetTitle) : false; console.log(hasTargetBook); // 输出true
实现「不存在则添加」的功能
Map用set()方法设置键值对,逻辑和对象版本类似:
function addBookIfNotExists(bookMap, genre, newBook) { let genreBooks = bookMap.get(genre); // 如果分类不存在,初始化空数组并设置到Map中 if (!genreBooks) { genreBooks = []; bookMap.set(genre, genreBooks); } // 用id判断书籍是否已存在 const bookExists = genreBooks.some(book => book.id === newBook.id); if (!bookExists) { genreBooks.push(newBook); console.log(`已添加书籍《${newBook.title}》到${genre}分类`); } else { console.log(`《${newBook.title}》已经在${genre}分类里啦`); } } // 示例调用:添加一本科幻小说 addBookIfNotExists(bookMap, 'Sci-Fi', { id: 789012, title: 'Dune', author: 'Frank Herbert' });
关于你之前的报错
你写的bookMap.get('Horror')如果是普通对象的话会报错,因为普通对象没有get()方法,得用bookMap['Horror']或者bookMap.Horror;如果是想用Map,那之前的bookMap定义语法错误,得改成new Map()的形式才行。
内容的提问来源于stack exchange,提问作者Reality is a Fractal
相关产品推荐
相关产品推荐

